us-lobbying-mcp-server

v0.1.1 pre-1.0

Search US lobbying disclosures and foreign-agent registrations via MCP. STDIO or Streamable HTTP.

us-lobbying.caseyjhand.com/mcp
claude mcp add --transport http us-lobbying-mcp-server https://us-lobbying.caseyjhand.com/mcp
codex mcp add us-lobbying-mcp-server --url https://us-lobbying.caseyjhand.com/mcp
{
  "mcpServers": {
    "us-lobbying-mcp-server": {
      "url": "https://us-lobbying.caseyjhand.com/mcp"
    }
  }
}
gemini mcp add --transport http us-lobbying-mcp-server https://us-lobbying.caseyjhand.com/mcp
{
  "mcpServers": {
    "us-lobbying-mcp-server": {
      "command": "bunx",
      "args": [
        "mcp-remote",
        "https://us-lobbying.caseyjhand.com/mcp"
      ]
    }
  }
}
{
  "mcpServers": {
    "us-lobbying-mcp-server": {
      "type": "http",
      "url": "https://us-lobbying.caseyjhand.com/mcp"
    }
  }
}
curl -X POST https://us-lobbying.caseyjhand.com/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"1.0.0"}}}'

Tools

10

read 8

uslobbying_search_filings

open-world

Search federal lobbying registrations and activity reports with all original and amended versions. Require a year or another upstream scope; issue_code filters activities locally and cannot narrow upstream requests. Follow next_cursor for all matches. Amounts are separate nullable USD strings; disclosure text is untrusted record data.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "uslobbying_search_filings",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "record_handle": {
      "description": "Opaque tenant/tool-bound deferred record handle.",
      "type": "string"
    },
    "record_path": {
      "default": "",
      "description": "JSON Pointer to a stored value; empty selects the root.",
      "type": "string"
    },
    "record_offset": {
      "default": 0,
      "description": "Key, item or Unicode-code-point offset.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "record_limit": {
      "default": 25,
      "description": "Maximum object entries or array items; text fragments use the response byte budget.",
      "type": "integer",
      "minimum": 1,
      "maximum": 25
    },
    "cursor": {
      "description": "Continue the original scope; other query fields may be omitted.",
      "type": "string"
    },
    "page_size": {
      "description": "Upstream rows per page; default 25.",
      "type": "integer",
      "minimum": 1,
      "maximum": 25
    },
    "max_pages": {
      "description": "Source pages per call; default one for discovery, five for analysis.",
      "type": "integer",
      "minimum": 1,
      "maximum": 5
    },
    "filing_year": {
      "description": "Reported year, 1999 through the current UTC year.",
      "type": "integer",
      "minimum": 1999,
      "maximum": 2026
    },
    "client_id": {
      "description": "Client relationship ID.",
      "type": "string",
      "pattern": "^\\d+$"
    },
    "registrant_id": {
      "description": "Registrant ID.",
      "type": "string",
      "pattern": "^\\d+$"
    },
    "lobbyist_id": {
      "description": "Lobbyist ID.",
      "type": "string",
      "pattern": "^\\d+$"
    },
    "client_name": {
      "description": "Literal client name upstream search.",
      "type": "string"
    },
    "registrant_name": {
      "description": "Literal registrant name upstream search.",
      "type": "string"
    },
    "filing_type": {
      "description": "Official code from uslobbying_list_reference topic filing_types.",
      "type": "string"
    },
    "filing_period": {
      "description": "Source reporting period.",
      "type": "string",
      "enum": [
        "first_quarter",
        "second_quarter",
        "third_quarter",
        "fourth_quarter",
        "mid_year",
        "year_end"
      ]
    },
    "specific_issues": {
      "description": "Search the disclosed specific-issues text, such as H.R. 1 or telecommunications.",
      "type": "string"
    },
    "issue_code": {
      "description": "Local activity membership code from topic issue_codes.",
      "type": "string"
    }
  },
  "required": [
    "record_path",
    "record_offset",
    "record_limit"
  ],
  "additionalProperties": false
}
view source ↗

uslobbying_get_client_profile

open-world

Resolve client relationship records by client_name in mode resolve (default), then use mode profile with explicit client_ids and years. IDs identify relationships with registrants, not a verified corporate identity. Follow collecting cursors before interpreting separate nullable income and expense ledgers. Typed rows preserve every audit filing and complete analytical list inline; optional canvas datasets support SQL.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "uslobbying_get_client_profile",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "record_handle": {
      "description": "Opaque tenant/tool-bound deferred record handle.",
      "type": "string"
    },
    "record_path": {
      "default": "",
      "description": "JSON Pointer to a stored value; empty selects the root.",
      "type": "string"
    },
    "record_offset": {
      "default": 0,
      "description": "Key, item or Unicode-code-point offset.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "record_limit": {
      "default": 25,
      "description": "Maximum object entries or array items; text fragments use the response byte budget.",
      "type": "integer",
      "minimum": 1,
      "maximum": 25
    },
    "cursor": {
      "description": "Continue the original scope; other query fields may be omitted.",
      "type": "string"
    },
    "page_size": {
      "description": "Upstream rows per page; default 25.",
      "type": "integer",
      "minimum": 1,
      "maximum": 25
    },
    "max_pages": {
      "description": "Source pages per call; default one for discovery, five for analysis.",
      "type": "integer",
      "minimum": 1,
      "maximum": 5
    },
    "mode": {
      "description": "resolve (default) finds client_name candidates; profile requires selected client_ids and years. Omit on continuation.",
      "type": "string",
      "enum": [
        "resolve",
        "profile"
      ]
    },
    "client_name": {
      "description": "Required literal name in resolve mode.",
      "type": "string"
    },
    "client_ids": {
      "description": "Required explicit relationships in profile mode.",
      "minItems": 1,
      "type": "array",
      "items": {
        "type": "string",
        "pattern": "^\\d+$",
        "description": "Digit-string source relationship identifier."
      }
    },
    "years": {
      "description": "Required explicit analytical year scope; sorted and deduplicated.",
      "minItems": 1,
      "type": "array",
      "items": {
        "type": "integer",
        "minimum": 1999,
        "maximum": 2026
      }
    },
    "canvas_id": {
      "description": "Reuse this canvas only after complete analytical acquisition.",
      "type": "string",
      "pattern": "^[A-Za-z0-9_-]{10}$"
    }
  },
  "required": [
    "record_path",
    "record_offset",
    "record_limit"
  ],
  "additionalProperties": false
}
view source ↗

uslobbying_get_issue_spending

open-world

Aggregate separate income and expense amounts on quarterly filings mentioning issue_code across explicit years. This is whole-filing association, not allocated issue spending; issue buckets overlap. All versions are acquired before latest-period selection and local issue filtering. Broad scans can take hours and exhaust temporary storage; narrow client_id or registrant_id when appropriate. Follow collecting cursors before interpreting final typed rows or optional SQL datasets.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "uslobbying_get_issue_spending",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "record_handle": {
      "description": "Opaque tenant/tool-bound deferred record handle.",
      "type": "string"
    },
    "record_path": {
      "default": "",
      "description": "JSON Pointer to a stored value; empty selects the root.",
      "type": "string"
    },
    "record_offset": {
      "default": 0,
      "description": "Key, item or Unicode-code-point offset.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "record_limit": {
      "default": 25,
      "description": "Maximum object entries or array items; text fragments use the response byte budget.",
      "type": "integer",
      "minimum": 1,
      "maximum": 25
    },
    "cursor": {
      "description": "Continue the original scope; other query fields may be omitted.",
      "type": "string"
    },
    "page_size": {
      "description": "Upstream rows per page; default 25.",
      "type": "integer",
      "minimum": 1,
      "maximum": 25
    },
    "max_pages": {
      "description": "Source pages per call; default one for discovery, five for analysis.",
      "type": "integer",
      "minimum": 1,
      "maximum": 5
    },
    "issue_code": {
      "description": "Required first-call code from uslobbying_list_reference topic issue_codes.",
      "type": "string"
    },
    "client_id": {
      "description": "Optional native client scope.",
      "type": "string",
      "pattern": "^\\d+$"
    },
    "registrant_id": {
      "description": "Optional native registrant scope.",
      "type": "string",
      "pattern": "^\\d+$"
    },
    "years": {
      "description": "Required explicit analytical year scope; sorted and deduplicated.",
      "minItems": 1,
      "type": "array",
      "items": {
        "type": "integer",
        "minimum": 1999,
        "maximum": 2026
      }
    },
    "canvas_id": {
      "description": "Reuse this canvas only after complete analytical acquisition.",
      "type": "string",
      "pattern": "^[A-Za-z0-9_-]{10}$"
    }
  },
  "required": [
    "record_path",
    "record_offset",
    "record_limit"
  ],
  "additionalProperties": false
}
view source ↗

uslobbying_search_lobbyists

open-world

Find lobbyists by name or registrant in mode search, then retrieve filing-scoped evidence with mode activity, lobbyist_id and filing_year. Covered positions are disclosed text, not verified present employment. Activity mode locally checks the requested lobbyist to prevent attributing another participant’s disclosure. Follow next_cursor for all results.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "uslobbying_search_lobbyists",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "record_handle": {
      "description": "Opaque tenant/tool-bound deferred record handle.",
      "type": "string"
    },
    "record_path": {
      "default": "",
      "description": "JSON Pointer to a stored value; empty selects the root.",
      "type": "string"
    },
    "record_offset": {
      "default": 0,
      "description": "Key, item or Unicode-code-point offset.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "record_limit": {
      "default": 25,
      "description": "Maximum object entries or array items; text fragments use the response byte budget.",
      "type": "integer",
      "minimum": 1,
      "maximum": 25
    },
    "cursor": {
      "description": "Continue the original scope; other query fields may be omitted.",
      "type": "string"
    },
    "page_size": {
      "description": "Upstream rows per page; default 25.",
      "type": "integer",
      "minimum": 1,
      "maximum": 25
    },
    "max_pages": {
      "description": "Source pages per call; default one for discovery, five for analysis.",
      "type": "integer",
      "minimum": 1,
      "maximum": 5
    },
    "mode": {
      "description": "search (default) finds identities by name or registrant; activity requires lobbyist_id and filing_year. Omit with cursor.",
      "type": "string",
      "enum": [
        "search",
        "activity"
      ]
    },
    "name": {
      "description": "Lobbyist identity name substring.",
      "type": "string"
    },
    "registrant_name": {
      "description": "Registrant identity name substring.",
      "type": "string"
    },
    "registrant_id": {
      "description": "Registrant identity ID.",
      "type": "string",
      "pattern": "^\\d+$"
    },
    "lobbyist_id": {
      "description": "Required in activity mode.",
      "type": "string",
      "pattern": "^\\d+$"
    },
    "filing_year": {
      "description": "Required report year in activity mode.",
      "type": "integer",
      "minimum": 1999,
      "maximum": 2026
    },
    "client_id": {
      "description": "Optional activity client relationship scope.",
      "type": "string",
      "pattern": "^\\d+$"
    },
    "covered_positions_only": {
      "description": "Activity only: require this lobbyist’s nonblank covered-position disclosure.",
      "type": "boolean"
    }
  },
  "required": [
    "record_path",
    "record_offset",
    "record_limit"
  ],
  "additionalProperties": false
}
view source ↗

uslobbying_get_contributions

open-world

Retrieve complete semiannual LD-203 reports, contributions, PAC relationships and certifications, preserving original and amended reports. Child predicates must match the same item; full parent contribution lists and matched_item_indexes remain available. Report counts are not donation counts and no cross-report donation total is inferred.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "uslobbying_get_contributions",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "record_handle": {
      "description": "Opaque tenant/tool-bound deferred record handle.",
      "type": "string"
    },
    "record_path": {
      "default": "",
      "description": "JSON Pointer to a stored value; empty selects the root.",
      "type": "string"
    },
    "record_offset": {
      "default": 0,
      "description": "Key, item or Unicode-code-point offset.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "record_limit": {
      "default": 25,
      "description": "Maximum object entries or array items; text fragments use the response byte budget.",
      "type": "integer",
      "minimum": 1,
      "maximum": 25
    },
    "cursor": {
      "description": "Continue the original scope; other query fields may be omitted.",
      "type": "string"
    },
    "page_size": {
      "description": "Upstream rows per page; default 25.",
      "type": "integer",
      "minimum": 1,
      "maximum": 25
    },
    "max_pages": {
      "description": "Source pages per call; default one for discovery, five for analysis.",
      "type": "integer",
      "minimum": 1,
      "maximum": 5
    },
    "filing_year": {
      "description": "Required first-call reporting year, 2008 through current UTC year.",
      "type": "integer",
      "minimum": 2008,
      "maximum": 2026
    },
    "filing_period": {
      "description": "Semiannual period.",
      "type": "string",
      "enum": [
        "mid_year",
        "year_end"
      ]
    },
    "registrant_id": {
      "description": "Registrant ID.",
      "type": "string",
      "pattern": "^\\d+$"
    },
    "lobbyist_id": {
      "description": "Lobbyist filer ID.",
      "type": "string",
      "pattern": "^\\d+$"
    },
    "registrant_name": {
      "description": "Registrant name upstream search.",
      "type": "string"
    },
    "lobbyist_name": {
      "description": "Lobbyist name upstream search.",
      "type": "string"
    },
    "contribution_type": {
      "description": "Official feca, he, me, ple or pic payment code.",
      "type": "string"
    },
    "contributor": {
      "description": "Case-insensitive literal contributor substring.",
      "type": "string"
    },
    "payee": {
      "description": "Case-insensitive literal payee substring.",
      "type": "string"
    },
    "honoree": {
      "description": "Case-insensitive literal honoree substring.",
      "type": "string"
    },
    "contribution_date_after": {
      "description": "Inclusive earliest item calendar date.",
      "type": "string",
      "format": "date",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
    },
    "contribution_date_before": {
      "description": "Inclusive latest item calendar date.",
      "type": "string",
      "format": "date",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
    }
  },
  "required": [
    "record_path",
    "record_offset",
    "record_limit"
  ],
  "additionalProperties": false
}
view source ↗

uslobbying_search_foreign_agents

open-world

Search official FARA daily registrant or foreign-principal snapshots, or retrieve one registration principal, short-form or document collection. Follow cursors to pinned local windows; principal status differs from registrant status. Disclosure records do not establish wrongdoing or influence.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "uslobbying_search_foreign_agents",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "mode": {
      "description": "Search daily snapshots or fetch one registration detail collection; defaults to search.",
      "type": "string",
      "enum": [
        "search",
        "detail"
      ]
    },
    "entity": {
      "description": "Search entity, default registrants; unavailable in detail mode.",
      "type": "string",
      "enum": [
        "registrants",
        "foreign_principals"
      ]
    },
    "name_contains": {
      "description": "Search-only literal case-insensitive token-AND match over entity names.",
      "type": "string"
    },
    "country": {
      "description": "Exact represented country/location label, foreign-principal search only.",
      "type": "string"
    },
    "status": {
      "description": "Selected entity status, default active; documents require all.",
      "type": "string",
      "enum": [
        "active",
        "terminated",
        "all"
      ]
    },
    "registration_number": {
      "description": "Lossless digit-string registration number, required for detail mode.",
      "type": "string",
      "pattern": "^\\d+$"
    },
    "detail": {
      "description": "Detail collection, default foreign_principals; unavailable in search mode.",
      "type": "string",
      "enum": [
        "foreign_principals",
        "short_forms",
        "documents"
      ]
    },
    "page_size": {
      "description": "Maximum records in one local output window, default 25.",
      "type": "integer",
      "minimum": 1,
      "maximum": 25
    },
    "cursor": {
      "description": "Opaque continuation; original filters may be omitted or repeated unchanged.",
      "type": "string",
      "minLength": 1
    },
    "record_handle": {
      "description": "Opaque tenant/tool-bound deferred record handle; exclusive with source selectors and cursor.",
      "type": "string",
      "minLength": 1
    },
    "record_path": {
      "default": "",
      "description": "JSON Pointer to a stored value; empty selects the root.",
      "type": "string"
    },
    "record_offset": {
      "default": 0,
      "description": "Key, item or Unicode-code-point offset.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "record_limit": {
      "default": 25,
      "description": "Maximum object entries or array items; text fragments use the response byte budget.",
      "type": "integer",
      "minimum": 1,
      "maximum": 25
    }
  },
  "required": [
    "record_path",
    "record_offset",
    "record_limit"
  ],
  "additionalProperties": false
}
view source ↗

uslobbying_list_reference

List official issue codes, filing types, government entities, contribution types and countries, or explain identifiers, methodology and FARA rules. Optional filter performs case-insensitive literal token-AND matching across the complete vocabulary. Follow next_cursor for pinned result windows; retrieve oversized entries with this tool using record_handle and record_path. Countries include separately attributed LDA codes and FARA source labels; FARA labels are not guessed ISO codes.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "uslobbying_list_reference",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "topic": {
      "description": "Vocabulary or explanatory topic; required on the first call.",
      "type": "string",
      "enum": [
        "issue_codes",
        "filing_types",
        "government_entities",
        "contribution_types",
        "countries",
        "identifiers",
        "methodology",
        "fara_rules"
      ]
    },
    "filter": {
      "description": "Every whitespace-separated token must occur literally in an entry.",
      "type": "string"
    },
    "cursor": {
      "description": "Pinned continuation; omit original topic/filter or repeat them unchanged.",
      "type": "string",
      "minLength": 1
    },
    "record_handle": {
      "description": "Opaque tenant/tool-bound deferred record handle.",
      "type": "string"
    },
    "record_path": {
      "default": "",
      "description": "JSON Pointer to a stored value; empty selects the root.",
      "type": "string"
    },
    "record_offset": {
      "default": 0,
      "description": "Key, item or Unicode-code-point offset.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "record_limit": {
      "default": 25,
      "description": "Maximum object entries or array items; text fragments use the response byte budget.",
      "type": "integer",
      "minimum": 1,
      "maximum": 25
    }
  },
  "required": [
    "record_path",
    "record_offset",
    "record_limit"
  ],
  "additionalProperties": false
}
view source ↗

uslobbying_dataframe_describe

Inspect exact staged table schemas, row counts, lifecycle, acquisition coverage and provenance before SQL.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "uslobbying_dataframe_describe",
    "arguments": {
      "canvas_id": "<canvas_id>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "canvas_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_-]{10}$",
      "description": "Canvas token returned by an analytical disclosure tool."
    },
    "table_name": {
      "description": "Existing table to inspect; omit for every table in this canvas.",
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "canvas_id"
  ],
  "additionalProperties": false
}
view source ↗

write 1

uslobbying_dataframe_query

Run one read-only SELECT over staged disclosure tables, materialize the complete result, then retrieve whole rows by result_table and next_offset without rerunning SQL. Inspect columns with uslobbying_dataframe_describe first.

write
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "uslobbying_dataframe_query",
    "arguments": {
      "canvas_id": "<canvas_id>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "canvas_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_-]{10}$",
      "description": "Canvas token returned by a disclosure analytical tool."
    },
    "sql": {
      "description": "One read-only SELECT; exclusive with result_table and offset.",
      "type": "string",
      "minLength": 1
    },
    "register_as": {
      "description": "Fresh result table name for a new SQL call; omit for a generated name.",
      "type": "string",
      "minLength": 1
    },
    "result_table": {
      "description": "Previously materialized result table; exclusive with sql and register_as.",
      "type": "string",
      "minLength": 1
    },
    "offset": {
      "description": "Canonical row offset for result_table, default zero.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "row_limit": {
      "default": 25,
      "description": "Maximum whole rows in this response; effective provider limit may be lower.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "required": [
    "canvas_id",
    "row_limit"
  ],
  "additionalProperties": false
}
view source ↗

disabled 1

uslobbying_dataframe_drop

Remove one staged table before expiry when deletion is enabled; an absent table returns dropped false.

disabledwould be destructive

Disabled. Dataframe deletion is disabled.

Set USLOBBYING_DATAFRAME_DROP_ENABLED=true to enable.
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "canvas_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_-]{10}$",
      "description": "Canvas token containing the table to remove."
    },
    "table_name": {
      "type": "string",
      "minLength": 1,
      "description": "Exact existing table name."
    }
  },
  "required": [
    "canvas_id",
    "table_name"
  ],
  "additionalProperties": false
}
view source ↗