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

  1. Append the extension ID as the arg immediately after mcp, e.g. ?cmd=goose&arg=mcp&arg=developer
  2. Before sharing, verify with new URLSearchParams(qs).getAll('arg') that the entry after 'mcp' exists and is non-empty
  3. 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

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


AI-assisted analysis of aaif-goose/goose@3810898a74 (2026-08-16). Data as JSON: /api/errors/a1d03537ff8bd6fe. Report an issue: GitHub.