h3-mcp logoh3-mcp

Completions

Autocomplete prompt arguments and template parameters.

completion/complete lets a client suggest values while the user is filling in a prompt argument or a resource-template parameter. You supply a complete callback; the method itself is wired for you on both eras.

#Prompt Arguments

Each argument can have its own callback, receiving the partial value typed so far:

import { defineMcpPrompt } from "h3-mcp";

const deployPrompt = defineMcpPrompt({
  name: "deploy",
  description: "Deploy to an environment",
  args: [
    {
      name: "environment",
      required: true,
      complete: async (value, event) => ({
        values: ["production", "staging", "development"].filter((e) => e.startsWith(value)),
      }),
    },
    {
      name: "region",
      complete: async (value) => ({
        values: ["us-east-1", "eu-west-1", "ap-south-1"].filter((r) => r.startsWith(value)),
        total: 3,
        hasMore: false,
      }),
    },
  ],
  handler: async (args) => ({
    messages: [
      {
        role: "user",
        content: { type: "text", text: `Deploy to ${args.environment} in ${args.region}` },
      },
    ],
  }),
});

values is required; total and hasMore are optional and let a client show "3 of 240 matches" instead of a truncated list.

#Resource Template Parameters

A template gets one callback for all of its parameters, so it receives the argument name too:

import { defineMcpResourceTemplate } from "h3-mcp";

const fileTemplate = defineMcpResourceTemplate({
  name: "project-file",
  uriTemplate: "app://files/{path}",
  description: "Project files",
  complete: async (argName, argValue, event) => {
    if (argName === "path") {
      return { values: await listFiles(argValue) };
    }
    return { values: [] };
  },
  handler: async (uri) => ({
    contents: [{ uri: uri.toString(), text: await readFile(uri.pathname) }],
  }),
});

#Capability

The server advertises completions: {} as soon as any prompt argument or resource template has a complete callback — there is nothing to enable.

Tip

Completion callbacks run on every keystroke a client sends. Keep them cheap: filter an in-memory list, or cache the expensive lookup outside the callback.

Important

argValue is untrusted input. Completing against a database or filesystem means an attacker can probe it one prefix at a time — scope the lookup to what that request is allowed to see, and cap the number of values you return.

h3-mcp logo

h3-mcp  MCP servers, built on H3.