Version 2.0 standardizes every tool contract and strengthens the artifact and mutation boundaries. Update the server and MCP client tool cache together; old response artifacts and cursors are intentionally not reusable.
- Every tool now rejects unknown arguments and uses strict camelCase wire names.
- Rename
patch_connection_tagstoreplace_connection_tags. - Rename
set_connection_metadatatoupdate_connection_metadata, and replace its boolean patch switch withmode="merge"ormode="replace". list_connectionsnow exposes Nango's documentedconnectionId,integrationId,search,endUserId,endUserOrganizationId, andlimitfilters. Arbitrary tag-query expansion was removed.apply_connection_conventionno longer accepts display-name or email overrides. It projects identity tags only from the native Nangoend_userrecord.- Add
update_connection_end_userfor nativeid,email, anddisplayNameupdates. It is deliberately separate from tag and metadata tools.
Legacy snake_case arguments and retired tool names are not aliases in v2.
- Response artifacts and cursors use contract version 2. Re-run the provider request to mint a v2 artifact, and repeat the query to mint a v2 cursor.
responsePathstill accepts exact RFC 6901 pointers. When an exact path is absent, v2 tries it once beneath the advertised/responseroot and reports the canonical path inresponseMeta.inferredResponsePath.- Complete object/array JSON can be recovered when a provider sends a missing or incorrect media type. The response includes a warning when inference was required.
- Provider 4xx/5xx envelopes take precedence over shaping controls, so an invalid
responsePathcan no longer hide the upstream failure. - MCP
resources/readfornango-mcp://artifact/<id>now returns a bounded descriptor, never the raw provider payload. Usequery_response_artifactas the sole JSON value reader. Binarynango-mcp://download/<id>resources remain byte-readable.
Inline mutation bodies are limited to 4 KiB, 40 total collection entries, and JSON depth 8. When proxy_request returns INLINE_BODY_REQUIRES_STAGING:
- Call
stage_proxy_request_bodywith the sameenvironmentand exactbody. - Retry
proxy_requestwith the returnedbodyArtifactId. - Omit
body; the two arguments are mutually exclusive.
Staged bodies are immutable, expiring, caller/environment-bound, HMAC content-bound, and digest-verified immediately before transmission. They have no read, list, query, or resource interface.
mutation_approval=hostmay delegate only exact-target provider DELETE paths with an unambiguous in-path ID and no query or body. Collection nouns, bulk/wildcard/template paths, query/body deletes, ambiguous targets, and configured override patterns remain server-approved.- OAuth provider reads require both
nango:proxyandnango:read; provider mutations and staging require bothnango:proxyandnango:write. Downloads require proxy plus read.
Version 1.0 is intentionally breaking. Update the package and MCP client configuration together.
- The package now uses MCP Python SDK 2.x and requires Python 3.11 or newer.
- Stdio remains the default.
- Streamable HTTP is enabled with
NANGO_MCP_TRANSPORT=httpand serves MCP at/mcp. - HTTP requires
NANGO_MCP_REQUEST_STATE_KEYSand either static bearer or OAuth resource-server authentication.
Remove every confirmation argument and delete NANGO_MCP_REQUIRE_CONFIRMATION. Mutations now use MCP-native input_required or elicitation. Keep NANGO_MCP_READ_ONLY=true for deployments that must expose no writes.
Static bearer policies choose mutation_approval=server or mutation_approval=host. DELETE operations always remain server-approved.
Rename proxy arguments:
| 0.x | 1.0 |
|---|---|
provider_config_key |
providerConfigKey |
connection_id |
connectionId |
base_url_override |
baseUrlOverride |
response_mode |
responseMode |
response_path |
responsePath |
response_page_size |
pageSize |
response_cursor |
cursor |
response_filter |
filters |
Unknown proxy arguments now fail validation. Provider JSON under response is unchanged, but MCP wrapper fields are camelCase: contentType, responseHeaders, rateLimit, and responseMeta.
proxy_request no longer returns an unbounded JSON text blob. Read the bounded structuredContent first.
- Follow
responseMeta.nextCursorwith the same query view for another bounded page. - Use
query_response_artifactfor structured inspection. - Let the MCP host fetch a returned
resource_linkwhen the complete representation is needed. - Do not expect or parse local filesystem paths.
Artifact query arguments are strict camelCase: artifactId, responsePath, pageSize, objectMode, and textSearch.
Use download_provider_file for provider binary responses. It returns metadata plus a protected MCP resource link; it does not return a host path.