aaif-goose/goose · warning
Missing extension ID in args
Error message
Missing extension ID in args
What it means
Thrown by the deeplink generator page in the goose documentation site when it loads with ?cmd=goose and an arg list containing 'mcp'. The page treats the query parameter immediately after 'mcp' as the built-in extension ID and builds a goose:// deeplink from it. If 'mcp' is the last arg entry, args[args.indexOf('mcp') + 1] is undefined and the page throws, rendering the raw message through setError. This is purely a URL-contract check on the query string; nothing in goose itself is failing.
Source
Thrown at documentation/src/pages/deeplink-generator.tsx:76
{
name: "API_KEY",
description: "Your API key",
required: true
}
]
};
setJsonInput(JSON.stringify(sampleJson, null, 2));
}, []);
useEffect(() => {
const urlParams = new URLSearchParams(window.location.search);
if (urlParams.toString()) {
try {
if (urlParams.get('cmd') === 'goose' && urlParams.getAll('arg').includes('mcp')) {
const args = urlParams.getAll('arg');
const extensionId = args[args.indexOf('mcp') + 1];
if (!extensionId) {
throw new Error('Missing extension ID in args');
}
const server: ServerConfig = {
is_builtin: true,
id: extensionId,
environmentVariables: []
};
const link = generateDeeplink(server);
handleGeneratedLink(link, true);
return;
}
const remoteUrl = urlParams.get('url');
if (remoteUrl) {
const id = urlParams.get('id');
const name = urlParams.get('name');
const description = urlParams.get('description');
if (!id || !name || !description) {View on GitHub (pinned to 3810898a74)
Solutions
- Append the extension ID as the arg immediately after mcp, e.g. ?cmd=goose&arg=mcp&arg=developer
- Before sharing, verify with new URLSearchParams(qs).getAll('arg') that the entry after 'mcp' exists and is non-empty
- If you keep making malformed links, build them with the on-page form instead of hand-writing the query string
Example fix
// before
const args = urlParams.getAll('arg');
const extensionId = args[args.indexOf('mcp') + 1];
if (!extensionId) {
throw new Error('Missing extension ID in args');
}
// after
const args = urlParams.getAll('arg');
const mcpIndex = args.indexOf('mcp');
const extensionId = mcpIndex !== -1 ? args[mcpIndex + 1] : undefined;
if (!extensionId) {
setError('Add the extension ID right after mcp, e.g. ?cmd=goose&arg=mcp&arg=developer');
return;
} Defensive patterns
Strategy: validation
Validate before calling
const args = new URLSearchParams(window.location.search).getAll('arg');
const mcpIndex = args.indexOf('mcp');
const hasExtensionId = mcpIndex !== -1 && Boolean(args[mcpIndex + 1]);
if (!hasExtensionId) setError('Add the extension ID right after mcp'); Try / catch
} catch (error) {
setError(error instanceof Error ? error.message : 'Invalid query string');
} Prevention
- Always place the extension ID as the arg immediately after mcp
- Validate generated URLs with URLSearchParams.getAll('arg') before sharing them
- Prefer the on-page form over hand-built query strings
When it happens
Trigger: Loading /deeplink-generator?cmd=goose&arg=mcp with no arg after 'mcp'; loading ?cmd=goose&arg=developer&arg=mcp where 'mcp' is the final repeated arg; an arg following 'mcp' that is present but empty (?arg=mcp&arg=).
Common situations: Hand-writing a shareable generator URL and forgetting the extension ID; a copied URL getting truncated right at 'mcp'; reordering repeated arg parameters so 'mcp' ends up last.
Related errors
- Missing required parameters. Need: id, name, and description
- Missing required parameter: cmd
- Resource '${fallbackUri}' returned no contents
- Unknown provider: ${providerId}
- Unsupported extension type for ACP: ${config.type}
AI-assisted analysis of aaif-goose/goose@3810898a74 (2026-08-16).
Data as JSON: /api/errors/a1d03537ff8bd6fe.
Report an issue: GitHub.