@agent-native/core 0.49.22 → 0.49.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/production-agent.d.ts +1 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +15 -0
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/tool-search.d.ts.map +1 -1
- package/dist/agent/tool-search.js +32 -7
- package/dist/agent/tool-search.js.map +1 -1
- package/dist/cli/connect.d.ts +2 -3
- package/dist/cli/connect.d.ts.map +1 -1
- package/dist/cli/connect.js +60 -37
- package/dist/cli/connect.js.map +1 -1
- package/dist/cli/pr-visual-recap-workflow.d.ts +5 -7
- package/dist/cli/pr-visual-recap-workflow.d.ts.map +1 -1
- package/dist/cli/pr-visual-recap-workflow.js +5 -7
- package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
- package/dist/cli/recap.d.ts +44 -52
- package/dist/cli/recap.d.ts.map +1 -1
- package/dist/cli/recap.js +441 -414
- package/dist/cli/recap.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +6 -3
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +1 -1
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +23 -3
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/agent-chat.d.ts +8 -0
- package/dist/client/agent-chat.d.ts.map +1 -1
- package/dist/client/agent-chat.js +43 -1
- package/dist/client/agent-chat.js.map +1 -1
- package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts.map +1 -1
- package/dist/client/blocks/library/AnnotatedCodeBlock.js +4 -1
- package/dist/client/blocks/library/AnnotatedCodeBlock.js.map +1 -1
- package/dist/client/blocks/library/DiffBlock.d.ts.map +1 -1
- package/dist/client/blocks/library/DiffBlock.js +20 -7
- package/dist/client/blocks/library/DiffBlock.js.map +1 -1
- package/dist/client/blocks/library/annotation-rail.js +5 -5
- package/dist/client/blocks/library/annotation-rail.js.map +1 -1
- package/dist/client/builder-frame.d.ts +2 -0
- package/dist/client/builder-frame.d.ts.map +1 -1
- package/dist/client/builder-frame.js +2 -0
- package/dist/client/builder-frame.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +15 -2
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/mcp-app-host.d.ts +3 -0
- package/dist/client/mcp-app-host.d.ts.map +1 -1
- package/dist/client/mcp-app-host.js +13 -0
- package/dist/client/mcp-app-host.js.map +1 -1
- package/dist/coding-tools/run-code.d.ts.map +1 -1
- package/dist/coding-tools/run-code.js +69 -17
- package/dist/coding-tools/run-code.js.map +1 -1
- package/dist/integrations/plugin.d.ts.map +1 -1
- package/dist/integrations/plugin.js +2 -0
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/mcp/build-server.d.ts +12 -10
- package/dist/mcp/build-server.d.ts.map +1 -1
- package/dist/mcp/build-server.js +53 -89
- package/dist/mcp/build-server.js.map +1 -1
- package/dist/mcp/connect-route.d.ts.map +1 -1
- package/dist/mcp/connect-route.js +5 -4
- package/dist/mcp/connect-route.js.map +1 -1
- package/dist/mcp/oauth-token.d.ts +6 -5
- package/dist/mcp/oauth-token.d.ts.map +1 -1
- package/dist/mcp/oauth-token.js.map +1 -1
- package/dist/mcp/stdio.d.ts.map +1 -1
- package/dist/mcp/stdio.js +9 -2
- package/dist/mcp/stdio.js.map +1 -1
- package/dist/provider-api/staging.d.ts.map +1 -1
- package/dist/provider-api/staging.js +6 -4
- package/dist/provider-api/staging.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +10 -7
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/docs/content/actions.md +1 -1
- package/docs/content/external-agents.md +53 -40
- package/docs/content/mcp-protocol.md +16 -11
- package/docs/content/pr-visual-recap.md +1 -1
- package/package.json +1 -1
|
@@ -74,20 +74,22 @@ export interface MCPConfig {
|
|
|
74
74
|
* Curated allow-list of action names served to **external connector** clients
|
|
75
75
|
* on a hosted multi-tenant deployment.
|
|
76
76
|
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
77
|
+
* Whenever this list is non-empty it is active by default for **every**
|
|
78
|
+
* caller — hosted connectors, code/stdio clients, and the local CLI alike.
|
|
79
|
+
* The MCP server trims both the advertised tool list *and* the callable
|
|
79
80
|
* surface to exactly these names (plus any builtin cross-app tools such as
|
|
80
81
|
* `list_apps` / `open_app`). Any tool call for a name **not** in the list is
|
|
81
82
|
* rejected — it is not merely hidden. This prevents the ~105-tool full
|
|
82
83
|
* catalog from landing in every external agent's context window and removes
|
|
83
84
|
* footguns (db-exec, seed-*, extension tools, browser-session tools, etc.)
|
|
84
|
-
* from
|
|
85
|
+
* from connectors. It is no longer gated behind an environment variable, and
|
|
86
|
+
* the catalog is never inferred from the client name/user-agent.
|
|
85
87
|
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
* `
|
|
90
|
-
*
|
|
88
|
+
* `tool-search` stays available in the compact catalog so any trimmed tool is
|
|
89
|
+
* reachable on demand. Callers who need the full surface up front opt in
|
|
90
|
+
* explicitly with `agent-native connect --full-catalog` (embeds a
|
|
91
|
+
* `catalog_scope: "full"` claim in the connect-minted JWT) or the
|
|
92
|
+
* deployment-wide `AGENT_NATIVE_MCP_FULL_CATALOG=1` env override.
|
|
91
93
|
*
|
|
92
94
|
* Declare this in your template's `createAgentChatPlugin` options rather than
|
|
93
95
|
* setting it on `MCPConfig` directly; the plugin copies it through.
|
|
@@ -235,8 +237,8 @@ export declare function verifyAuth(authHeader: string | undefined, ownerEmailHea
|
|
|
235
237
|
/**
|
|
236
238
|
* The caller explicitly opted up to the full connector catalog by minting
|
|
237
239
|
* their token with `--full-catalog` (or equivalent). When `true`, the
|
|
238
|
-
* connector-catalog tier filter
|
|
239
|
-
* `
|
|
240
|
+
* compact/connector-catalog tier filter (active by default whenever a
|
|
241
|
+
* `connectorCatalog` is declared) is bypassed for this caller. Derived from a
|
|
240
242
|
* `catalog_scope: "full"` claim in the verified A2A/connect JWT.
|
|
241
243
|
*/
|
|
242
244
|
fullCatalog?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-server.d.ts","sourceRoot":"","sources":["../../src/mcp/build-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAsChE,MAAM,WAAW,SAAS;IACxB,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,KAAK,CAAC,EAAE,KAAK,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;KAC1B,CAAC,CAAC;IACH,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACrC;;;;;;;;;;;OAWG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAChD,qEAAqE;IACrE,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B
|
|
1
|
+
{"version":3,"file":"build-server.d.ts","sourceRoot":"","sources":["../../src/mcp/build-server.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/build-server.js
CHANGED
|
@@ -39,6 +39,10 @@ const COMPACT_MCP_APP_CATALOG_BUILTINS = new Set([
|
|
|
39
39
|
"open_app",
|
|
40
40
|
"ask_app",
|
|
41
41
|
"create_embed_session",
|
|
42
|
+
// `tool-search` MUST stay in every compact/connector surface: it is how a
|
|
43
|
+
// compacted client discovers and loads any action on demand, which is what
|
|
44
|
+
// makes "small catalog by default" safe instead of limiting.
|
|
45
|
+
"tool-search",
|
|
42
46
|
]);
|
|
43
47
|
function isActionAdvertisedInCompactMcpAppCatalog(name, entry, config) {
|
|
44
48
|
if (COMPACT_MCP_APP_CATALOG_BUILTINS.has(name))
|
|
@@ -52,71 +56,38 @@ function isActionAdvertisedInCompactMcpAppCatalog(name, entry, config) {
|
|
|
52
56
|
}
|
|
53
57
|
return false;
|
|
54
58
|
}
|
|
55
|
-
const MCP_APP_OAUTH_CLIENT_RE = /\b(chatgpt|openai|claude|anthropic)\b/i;
|
|
56
|
-
const NON_APP_OAUTH_CLIENT_RE = /\b(code|cli|cursor|codex|goose|postman|mcpjam|inspector)\b/i;
|
|
57
|
-
const MCP_APP_OAUTH_REDIRECT_HOST_RE = /(^|\.)((chatgpt|openai)\.com|claude\.ai|anthropic\.com)$/i;
|
|
58
|
-
const FULL_CATALOG_CLIENT_RE = /\b(agent-native-mcp-(proxy|stdio|standalone)|code|cli|cursor|codex|goose|postman|mcpjam|inspector)\b/i;
|
|
59
|
-
async function isKnownMcpAppOAuthClient(identity) {
|
|
60
|
-
const clientId = identity?.oauthClientId?.trim();
|
|
61
|
-
if (!clientId)
|
|
62
|
-
return false;
|
|
63
|
-
function isKnownAppClientName(value) {
|
|
64
|
-
if (!value)
|
|
65
|
-
return false;
|
|
66
|
-
return (MCP_APP_OAUTH_CLIENT_RE.test(value) &&
|
|
67
|
-
!NON_APP_OAUTH_CLIENT_RE.test(value));
|
|
68
|
-
}
|
|
69
|
-
function isKnownNonAppClientName(value) {
|
|
70
|
-
return Boolean(value && NON_APP_OAUTH_CLIENT_RE.test(value));
|
|
71
|
-
}
|
|
72
|
-
function isKnownMcpAppRedirectUri(uri) {
|
|
73
|
-
try {
|
|
74
|
-
const url = new URL(uri);
|
|
75
|
-
return (url.protocol === "https:" &&
|
|
76
|
-
MCP_APP_OAUTH_REDIRECT_HOST_RE.test(url.hostname));
|
|
77
|
-
}
|
|
78
|
-
catch {
|
|
79
|
-
return false;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
if (isKnownAppClientName(clientId))
|
|
83
|
-
return true;
|
|
84
|
-
if (isKnownNonAppClientName(clientId))
|
|
85
|
-
return false;
|
|
86
|
-
try {
|
|
87
|
-
const { getOAuthClient } = await import("./oauth-store.js");
|
|
88
|
-
const client = await getOAuthClient(clientId);
|
|
89
|
-
// If the token carries an OAuth client id but its registration is missing,
|
|
90
|
-
// keep the model on the compact MCP Apps surface instead of exposing every
|
|
91
|
-
// private action/schema.
|
|
92
|
-
if (!client)
|
|
93
|
-
return true;
|
|
94
|
-
if (isKnownAppClientName(client.clientName))
|
|
95
|
-
return true;
|
|
96
|
-
if (isKnownNonAppClientName(client.clientName))
|
|
97
|
-
return false;
|
|
98
|
-
if (client.redirectUris.some(isKnownMcpAppRedirectUri))
|
|
99
|
-
return true;
|
|
100
|
-
// Most OAuth hosts are UI-oriented MCP clients. Preserve the full catalog
|
|
101
|
-
// only for known code/CLI clients so unknown browser hosts cannot trigger
|
|
102
|
-
// massive resources/list payloads.
|
|
103
|
-
return true;
|
|
104
|
-
}
|
|
105
|
-
catch {
|
|
106
|
-
// On metadata lookup errors, fail compact instead of falling back to the
|
|
107
|
-
// full action surface; ChatGPT/Claude old tokens otherwise get huge lists.
|
|
108
|
-
return true;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
59
|
function explicitlyRequestsFullMcpCatalog(requestMeta) {
|
|
60
|
+
// Full catalog is a deliberate, rare opt-in — NEVER a default, and NEVER
|
|
61
|
+
// inferred from the client name / user-agent. It is reached only by an
|
|
62
|
+
// explicit deployment env or a token minted with
|
|
63
|
+
// `agent-native connect --full-catalog` (which embeds `catalog_scope: "full"`,
|
|
64
|
+
// surfaced here as requestMeta.fullCatalog). Dumping ~105 tool schemas
|
|
65
|
+
// (100k+ tokens) into a context window just because a client called itself
|
|
66
|
+
// "code"/"cursor"/"codex" was a recurring footgun. Everything else gets the
|
|
67
|
+
// connector/compact catalog plus `tool-search`, which keeps every tool
|
|
68
|
+
// reachable on demand.
|
|
112
69
|
if (process.env.AGENT_NATIVE_MCP_FULL_CATALOG === "1")
|
|
113
70
|
return true;
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
71
|
+
return requestMeta?.fullCatalog === true;
|
|
72
|
+
}
|
|
73
|
+
const warnedFullCatalogKeys = new Set();
|
|
74
|
+
/**
|
|
75
|
+
* Loud, deduped warning emitted whenever the full MCP catalog is actually
|
|
76
|
+
* served. Full catalog is a deliberate, rare opt-in (env or a `--full-catalog`
|
|
77
|
+
* token claim); logging it makes an accidental ~100k-token tool dump visible
|
|
78
|
+
* instead of silent, so a regression can't quietly reintroduce the footgun.
|
|
79
|
+
*/
|
|
80
|
+
function warnFullCatalogServed(toolCount) {
|
|
81
|
+
const source = process.env.AGENT_NATIVE_MCP_FULL_CATALOG === "1"
|
|
82
|
+
? "AGENT_NATIVE_MCP_FULL_CATALOG=1"
|
|
83
|
+
: "a token minted with --full-catalog (catalog_scope:full)";
|
|
84
|
+
const key = `${source}:${toolCount}`;
|
|
85
|
+
if (warnedFullCatalogKeys.has(key))
|
|
86
|
+
return;
|
|
87
|
+
warnedFullCatalogKeys.add(key);
|
|
88
|
+
console.warn(`[agent-native] Serving the FULL MCP tool catalog (${toolCount} tools) via ${source}. ` +
|
|
89
|
+
`This is a large context payload meant to be a rare, explicit opt-in — most ` +
|
|
90
|
+
`clients should use the default compact/connector catalog + tool-search instead.`);
|
|
120
91
|
}
|
|
121
92
|
/**
|
|
122
93
|
* Returns true when the given action name is in the template's connector
|
|
@@ -132,18 +103,6 @@ function isActionInConnectorCatalog(name, config) {
|
|
|
132
103
|
return false;
|
|
133
104
|
return config.connectorCatalog.includes(name);
|
|
134
105
|
}
|
|
135
|
-
function shouldUseCompactMcpCatalogByDefault(identity, requestMeta) {
|
|
136
|
-
if (explicitlyRequestsFullMcpCatalog(requestMeta))
|
|
137
|
-
return false;
|
|
138
|
-
// OAuth callers are classified through `isKnownMcpAppOAuthClient`: unknown
|
|
139
|
-
// OAuth clients compact by default, while known code/CLI clients stay full.
|
|
140
|
-
if (identity?.oauthClientId)
|
|
141
|
-
return false;
|
|
142
|
-
// A real authenticated remote HTTP caller with no OAuth client metadata is
|
|
143
|
-
// usually a chat-host static-token connector. Keep it on the app-facing
|
|
144
|
-
// verbs so a host cannot dump every action schema into a giant tool card.
|
|
145
|
-
return requestMeta?.fullSurface === true;
|
|
146
|
-
}
|
|
147
106
|
function metadataObject(value) {
|
|
148
107
|
return value && typeof value === "object" && !Array.isArray(value)
|
|
149
108
|
? value
|
|
@@ -844,25 +803,27 @@ export async function createMCPServerForRequest(config, identity, requestMeta) {
|
|
|
844
803
|
: config.actions;
|
|
845
804
|
const actions = mergeBuiltinTools(config, baseActions, requestMeta);
|
|
846
805
|
const visibleActions = Object.fromEntries(Object.entries(actions).filter(([, entry]) => isActionVisibleForOAuthScope(entry, effectiveIdentity?.oauthScopes)));
|
|
847
|
-
const
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
806
|
+
const fullCatalogRequested = explicitlyRequestsFullMcpCatalog(requestMeta);
|
|
807
|
+
// Compact/connector is the DEFAULT for every caller — hosted connectors,
|
|
808
|
+
// code clients (Claude Code / Cursor / Codex), and the local CLI alike. The
|
|
809
|
+
// full ~105-tool catalog is served only on the explicit opt-in above, so a
|
|
810
|
+
// host can never dump every action schema into one giant tool card. The
|
|
811
|
+
// `mcp:apps` scope still lands on this compact MCP-Apps surface; with no
|
|
812
|
+
// opt-in, everyone else does too.
|
|
813
|
+
const compactMcpAppCatalog = !fullCatalogRequested;
|
|
853
814
|
const advertisedActionsBeforeConnector = compactMcpAppCatalog
|
|
854
815
|
? Object.fromEntries(Object.entries(visibleActions).filter(([name, entry]) => isActionAdvertisedInCompactMcpAppCatalog(name, entry, config)))
|
|
855
816
|
: visibleActions;
|
|
856
|
-
// Connector-catalog tier:
|
|
857
|
-
//
|
|
858
|
-
//
|
|
859
|
-
//
|
|
860
|
-
//
|
|
861
|
-
// db-exec / seed-* / extension /
|
|
862
|
-
|
|
863
|
-
|
|
817
|
+
// Connector-catalog tier: when a template declares a connector allow-list,
|
|
818
|
+
// serve exactly that curated surface (+ cross-app builtins + tool-search) to
|
|
819
|
+
// external callers unless they explicitly opted into the full catalog. This
|
|
820
|
+
// is active by default whenever a catalog is declared — no env flag required —
|
|
821
|
+
// so the ~105-tool full catalog can never leak just because a deployment
|
|
822
|
+
// forgot to set one. It also keeps db-exec / seed-* / extension /
|
|
823
|
+
// browser-session footguns off the external surface.
|
|
824
|
+
const connectorCatalogActive = Array.isArray(config.connectorCatalog) &&
|
|
864
825
|
config.connectorCatalog.length > 0 &&
|
|
865
|
-
!
|
|
826
|
+
!fullCatalogRequested;
|
|
866
827
|
// When the connector catalog is active, filter directly from visibleActions
|
|
867
828
|
// rather than advertisedActionsBeforeConnector. This ensures the connector
|
|
868
829
|
// tier is an independent, template-declared surface that doesn't accidentally
|
|
@@ -871,6 +832,9 @@ export async function createMCPServerForRequest(config, identity, requestMeta) {
|
|
|
871
832
|
const advertisedActions = connectorCatalogActive
|
|
872
833
|
? Object.fromEntries(Object.entries(visibleActions).filter(([name]) => isActionInConnectorCatalog(name, config)))
|
|
873
834
|
: advertisedActionsBeforeConnector;
|
|
835
|
+
if (fullCatalogRequested) {
|
|
836
|
+
warnFullCatalogServed(Object.keys(advertisedActions).length);
|
|
837
|
+
}
|
|
874
838
|
const supportsMcpApps = compactMcpAppCatalog ||
|
|
875
839
|
Object.values(advertisedActions).some((entry) => Boolean(entry.mcpApp?.resource));
|
|
876
840
|
const server = new Server(mcpServerInfo(config, requestMeta), {
|