workiva-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| WORKIVA_PROFILE | No | Profile name to use from the credentials file (default profile chosen by precedence). | |
| WORKIVA_CLIENT_ID | No | Client ID for the Workiva API (used if no credentials file). | |
| WORKIVA_KB_DRAFTS | No | Directory for storing KB drafts (default: ~/.workiva/kb/drafts/). | |
| WORKIVA_ALLOW_WRITES | No | Set to '1' to enable write operations (default: read-only). | |
| WORKIVA_CLIENT_SECRET | No | Client Secret for the Workiva API (used if no credentials file). | |
| WORKIVA_CREDENTIALS_FILE | No | Path to the credentials file (default: ~/.workiva/credentials). |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| kb_searchA | Search accumulated Workiva API knowledge BEFORE attempting unfamiliar work, and whenever a call fails unexpectedly. Pass the literal error text if you have one — entries are indexed on symptom strings. Otherwise pass the task ("create incoming connection", "write to spreadsheet"). Answers: is this possible via the API at all, what is the real endpoint, what will fail first. |
| kb_listA | List KB entries, optionally filtered by surface (wdata, platform, graph, spreadsheets, chains, auth) or severity (blocker, gotcha, nuance). Reading all blocker entries before planning Workiva work is cheap and prevents committing to approaches that have no API path. |
| kb_getA | Retrieve one KB entry in full, including its evidence. |
| kb_addA | Record a newly discovered Workiva quirk so nobody researches it twice. Add an entry whenever you lost more than a few minutes to something not obvious from the docs — especially "there is no API for this". entry_id stable kebab-case slug, e.g. wdata-upload-requires-zip severity blocker (no API path) | gotcha (obvious approach fails) | nuance symptom pipe-separated literal error strings — the primary search key; required for blockers and gotchas tags comma-separated api_version pass the dated X-Version you ran against, if known The draft lands in ~/.workiva/kb/drafts/ — local to this machine, searchable immediately. A human later promotes it into the shared KB by PR. |
| wdata_list_tablesA | List Wdata tables: id, name, databaseId, lastUploaded — and sql_ref, the exact qualified reference SQL requires. Wdata SQL cannot reference tables by name (KB: wdata-sql-requires-qualified-table-refs). Copy sql_ref verbatim into your query: SELECT ... FROM AS "alias". The databaseId doubles as the workspace id in Spreadsheets UI URLs. |
| wdata_get_tableB | Full detail for one Wdata table, including its column schema. |
| wdata_list_queriesA | List saved Wdata queries with id, name and updated timestamp. |
| wdata_run_sqlA | Execute one-off Wdata SQL and return rows. Tables MUST be referenced by the sql_ref from wdata_list_tables — "databaseId"."tableId" AS "alias" — plain names do not resolve. The dialect is Trino. Mechanics: there is no ad-hoc SQL endpoint, so this creates a temporary saved query, runs it, downloads the CSV result, then deletes the temporary query. |
| wdata_run_saved_queryB | Execute a saved Wdata query by id (see wdata_list_queries) and return its rows. |
| wdata_list_connectionsA | List Wdata connections (live query -> spreadsheet links). A filter pair is REQUIRED — either (source_type, source_id) or (destination_type, destination_id), e.g. source_type "wdata_query" with a query id. Connections cannot be CREATED via the API (KB: connections-cannot-be-created-via-api) — only listed and refreshed. |
| wdata_create_tableA | WRITE. Create a Wdata table. columns_json: JSON array of {"name": ..., "type": ...} column dicts — valid types are catalogued in the KB (kb_get wdata-column-types). |
| wdata_upload_and_importA | WRITE. Upload a local .csv/.tsv/.json (or .zip of one) into a Wdata table and import it: upload -> import -> poll until settled, in one call (upload alone does NOT import — KB: wdata-upload-then-import-two-steps). Row-level import errors are surfaced if the import fails. Note the import adds system columns to the table, and re-uploading an identical filename 409s (KB: wdata-duplicate-filename-409). |
| wdata_refresh_connectionA | WRITE. Refresh an existing connection and wait for it to settle — this updates the destination spreadsheet's data in place. Find connection ids with wdata_list_connections. Connections can only be refreshed, never created, via the API. |
| graph_typesA | List all graph record type names available in this workspace. |
| graph_recordsA | Fetch graph records of one type (find names via graph_types). A type filter is mandatory — the API rejects an unfiltered listing (KB: graph-records-filter-required). Set expand_relationships to walk the record's edges. |
| graph_editsA | WRITE. Apply graph edits: a JSON array of operations — create_record, create_relationship, set_properties, delete_relationship, delete_record. Records are created via edits; there is no POST /graph/records (KB: graph-records-created-via-edits). WARNING: if the response carries no temp-id map, do NOT retry — the records were likely created anyway. Read back with graph_records and reconcile (KB: graph-edits-id-map-unreliable). |
| spreadsheet_list_sheetsB | List sheets in a spreadsheet, including any bound dataset. |
| spreadsheet_updateA | WRITE. Write to a sheet. operations_json is one of editRange, editCells, applyFormats or resizeColumns; all indices 0-based and inclusive. Send numbers as JSON numbers, not strings, or CURRENCY/PERCENT formats will not apply (KB: spreadsheet-write-operations). Waits for the async operation to complete. |
| spreadsheet_ui_urlA | Build the Spreadsheets UI URL for a spreadsheet or sheet. No API returns this URL, but the query-result export endpoint and human users both need it; it is constructed from the workspace id (KB: spreadsheet-ui-url-format). Defaults to the first sheet. |
| workiva_requestA | Escape hatch for any endpoint not wrapped by a dedicated tool (tags, parameters, pivot views, folders, file downloads, admin, ...). surface — which host the path is relative to (KB: three-distinct-api-hosts): platform https://api.app.wdesk.com (X-Version added for you) wdata https://h.app.wdesk.com/s/wdata/prep/api/v1 chains https://h.app.wdesk.com/s/wdata/oc/api/v1 body_json / params_json are JSON strings. GET is always allowed; any other method counts as a WRITE here and requires writes enabled (read-style POSTs like query execution have dedicated tools that stay available). If a call fails in a way no KB entry explains, that is new knowledge — record it with kb_add. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/woof-xyz/workiva-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server