CONNECT APP
Build with Coda
Productivity
- API key
MCP
Give your agent Coda tools
Every Coda action is exposed as an MCP tool on Pipedream's remote server. Point a client at it with your end user's ID and Connect resolves that user's Coda account for each tool call — you store no tokens.
// accessToken: mint a short-lived token with the Connect SDK — see the MCP guide
const transport = new StreamableHTTPClientTransport(
new URL("https://remote.mcp.pipedream.net/v3"),
{
requestInit: {
headers: {
Authorization: `Bearer ${accessToken}`,
"x-pd-project-id": "{project_id}",
"x-pd-environment": "production",
"x-pd-external-user-id": "{external_user_id}", // any stable ID for this user in your system
"x-pd-app-slug": "coda",
},
},
},
)
const mcp = new Client({ name: "my-agent", version: "1.0.0" })
await mcp.connect(transport)
const { tools } = await mcp.listTools()
// e.g. run Copy Doc:
const result = await mcp.callTool({
name: "coda-copy-doc",
arguments: {
docId: "Source Doc ID",
title: "Title",
},
})# access_token: mint a short-lived token with the Connect SDK — see the MCP guide
headers = {
"Authorization": f"Bearer {access_token}",
"x-pd-project-id": "{project_id}",
"x-pd-environment": "production",
"x-pd-external-user-id": "{external_user_id}", # any stable ID for this user in your system
"x-pd-app-slug": "coda",
}
async with streamablehttp_client("https://remote.mcp.pipedream.net/v3", headers=headers) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
tools = await session.list_tools()
# e.g. run Copy Doc:
result = await session.call_tool("coda-copy-doc", {
"docId": "Source Doc ID",
"title": "Title",
})API PROXY
Call the Coda API directly
For an endpoint with no pre-built tool, the Connect proxy forwards your request to the Coda API with the connected user's credentials attached. You store no tokens and write no refresh logic.
const resp = await pd.proxy.get({
externalUserId: "{external_user_id}", // any stable ID for this user in your system
accountId: "apn_xxxxxxx",
url: "https://coda.io/apis/v1/whoami",
})
// Any allowed Coda endpoint works here. Pipedream attaches the
// connected account's credentials to the outgoing request.# The path segment is the target URL, URL-safe base64 encoded:
# https://coda.io/apis/v1/whoami
curl "https://api.pipedream.com/v1/connect/{project_id}/proxy/aHR0cHM6Ly9jb2RhLmlvL2FwaXMvdjEvd2hvYW1p?external_user_id={external_user_id}&account_id=apn_xxxxxxx" \
-H "Authorization: Bearer {access_token}" \
-H "x-pd-environment: production"SDK
Run Coda actions from your backend
Connect a user's Coda account once, then run Copy Doc on their behalf from your own code — TypeScript, Python, or plain HTTP.
import { PipedreamClient } from "@pipedream/sdk"
const pd = new PipedreamClient({
projectId: process.env.PIPEDREAM_PROJECT_ID!,
clientId: process.env.PIPEDREAM_CLIENT_ID!,
clientSecret: process.env.PIPEDREAM_CLIENT_SECRET!,
projectEnvironment: "production",
})
const result = await pd.actions.run({
id: "coda-copy-doc",
externalUserId: "{external_user_id}", // any stable ID for this user in your system
configuredProps: {
coda: { authProvisionId: "apn_xxxxxxx" },
docId: "Source Doc ID",
title: "Title",
},
})from pipedream import Pipedream
pd = Pipedream(
client_id="{oauth_client_id}",
client_secret="{oauth_client_secret}",
project_id="{project_id}",
project_environment="production",
)
result = pd.actions.run(
id="coda-copy-doc",
external_user_id="{external_user_id}", # any stable ID for this user in your system
configured_props={
"coda": {"authProvisionId": "apn_xxxxxxx"},
"docId": "Source Doc ID",
"title": "Title",
},
)curl -X POST https://api.pipedream.com/v1/connect/{project_id}/actions/run \
-H "Content-Type: application/json" \
-H "X-PD-Environment: production" \
-H "Authorization: Bearer {access_token}" \
-d '{
"external_user_id": "{external_user_id}",
"id": "coda-copy-doc",
"configured_props": {
"coda": { "authProvisionId": "apn_xxxxxxx" },
"docId": "Source Doc ID",
"title": "Title"
}
}'TOOLS
Coda actions
On-demand operations your product or agent can configure and run on behalf of a connected user.
-
Copy Doc
actionCreates a copy of the specified doc. See docsWritev0.0.6 -
Create Doc
actionCreates a new doc. See docsWritev0.0.6 -
Create Rows
actionCreates a new row in a Coda table. Requires a doc ID and table ID — use the List Docs and List Tables actions to discover these. Column values are set viacolumnValues, a flat object mapping column ID or name to value (use the List Columns action to look up column IDs); plain text is fine for text fields, no special formatting needed. Use this action for straightforward inserts; if a matching row might already exist and you want to avoid creating a duplicate, use Upsert Rows instead. See the documentationWritev1.0.0 -
Delete Row
actionDelete a single row by name or ID. See docsWritev0.0.5 -
Find Row
actionSearches for a row in the selected table using a column match search. See docsRead-onlyv0.0.7 -
Get Page Content
actionFetch the content of a single page by name or ID. See docsRead-onlyv0.0.2 -
Get Page Content
actionFetch the content of a single page by name or ID. See docsRead-onlyv0.0.2 -
Get Row
actionFetch a single row by name or ID. See docsRead-onlyv0.0.5 -
List Columns
actionLists columns in a table. See docsRead-onlyv0.0.6 -
List Docs
actionReturns a list of docs accessible by the user. These are returned in the same order as on the docs page: reverse chronological by the latest event relevant to the user (last viewed, edited, or shared). See docsRead-onlyv0.0.8 -
List Formulas
actionLists formulas in a doc. See docsRead-onlyv0.0.4 -
List Pages
actionList all pages in a document. See docsRead-onlyv0.0.2 -
List Tables
actionLists tables in a doc. See docsRead-onlyv0.0.6 -
Update a Row
actionUpdates an existing row in a Coda table. Requires a doc ID, table ID, and row ID — use the List Docs, List Tables, and Find Row actions to discover these. Column values to change are set viacolumnValues, a flat object mapping column ID or name to value (use the List Columns action to look up column IDs). Use this action when you already know the specific row's ID; if you only know a value to match on (e.g. update-or-create by name) rather than the row's own ID, use Upsert Rows instead. See the documentationWritev1.0.0 -
Upsert Rows
actionCreates a new row, or updates an existing row if one already matches the givenkeyColumnsvalues, in a Coda table. Requires a doc ID and table ID — use the List Docs and List Tables actions to discover these.keyColumnsidentifies which column(s) uniquely identify a row (e.g. a name or external ID column) — use the List Columns action to look up column IDs; leave it blank to always insert a new row instead of matching an existing one. Column values are set viacolumnValues, a flat object mapping column ID or name to value. Use this action instead of Create Rows when a matching row might already exist and you want to avoid duplicates, or instead of Update Row when you don't already know the target row's ID. When upserting, if multiple rows match the specified key column(s), they will all be updated with the specified value. See the documentationWritev1.0.0
MULTI-APP
Use Coda with other popular apps
Most products don't stop at one integration. Pair Coda with the other apps your users rely on, and ship use cases that span both.
- App slug
- coda
- Authentication
- API key
- Categories
- Productivity
- Actions
- 15
- Triggers
- 1
- API proxy
- Available