Skip to main content
Glama
matthewdtowles

iwantmymtg-mcp

add_inventory

Add Magic: The Gathering cards to your inventory batchwise. Specify card ID, quantity, and whether foil to track your collection.

Instructions

Add one or more cards to the authenticated user's inventory. Accepts a batch - pass a single-item array for one card. This is a real write. Use update_inventory to change quantities, remove_inventory to delete a row. Requires IWMM_API_KEY.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
itemsYes

Implementation Reference

  • The addInventoryTool definition containing the name, description, inputSchema, and the handler function that sends a POST request to /api/v1/inventory with the items array.
    export const addInventoryTool = {
      name: "add_inventory",
      description:
        "Add one or more cards to the authenticated user's inventory. Accepts a batch - pass a single-item array for one card. This is a real write. Use update_inventory to change quantities, remove_inventory to delete a row. Requires IWMM_API_KEY.",
      inputSchema: z.object({ items: z.array(inventoryItem).min(1) }),
      handler: (input: { items: z.infer<typeof inventoryItem>[] }) =>
        apiFetch({ path: "/api/v1/inventory", method: "POST", body: input.items, authenticated: true }),
    };
  • Zod schema for an inventory item, used as the element type in addInventoryTool's inputSchema (z.array(inventoryItem)).
    const inventoryItem = z.object({
      cardId: z.string().uuid().describe("Internal IWMM card UUID. Get from search_cards or get_card."),
      quantity: z.number().int().min(0).describe("Total quantity for this card+finish. 0 removes the row."),
      isFoil: z.boolean().describe("Whether this is the foil variant. Foil and non-foil are tracked as separate rows."),
    });
  • Registration of addInventoryTool in the tools array, which is exported and used by the MCP server to list and dispatch tool calls.
    addInventoryTool,
  • Lookup map from tool name to tool definition, used by the server's CallToolRequestSchema handler to dispatch add_inventory calls.
    export const toolsByName: Record<string, ToolDefinition> = Object.fromEntries(
      tools.map((t) => [t.name, t]),
    );
  • The apiFetch helper function used by the addInventoryTool handler to make the authenticated POST request to /api/v1/inventory.
    export async function apiFetch<T = unknown>(req: ApiRequest): Promise<T> {
      const url = new URL(req.path, config.baseUrl);
      if (req.query) {
        for (const [k, v] of Object.entries(req.query)) {
          if (v !== undefined && v !== null && v !== "") {
            url.searchParams.set(k, String(v));
          }
        }
      }
    
      const headers: Record<string, string> = {
        Accept: "application/json",
        "User-Agent": "iwantmymtg-mcp/0.0.1",
      };
    
      if (req.authenticated) {
        const { requireApiKey } = await import("./config.js");
        headers["Authorization"] = `Bearer ${requireApiKey()}`;
      }
    
      if (req.body !== undefined) {
        headers["Content-Type"] = "application/json";
      }
    
      const res = await fetch(url, {
        method: req.method ?? "GET",
        headers,
        body: req.body !== undefined ? JSON.stringify(req.body) : undefined,
      });
    
      if (!res.ok) {
        const text = await res.text();
        throw new ApiError(res.status, text, {
          limit: res.headers.get("X-RateLimit-Limit") ?? undefined,
          remaining: res.headers.get("X-RateLimit-Remaining") ?? undefined,
          reset: res.headers.get("X-RateLimit-Reset") ?? undefined,
        });
      }
    
      if (res.status === 204) return undefined as T;
      return (await res.json()) as T;
    }
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description bears full burden. It states 'real write' and auth requirement, but doesn't disclose failure modes, idempotency, or side effects beyond the write. Lacks complete transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, no filler. Front-loaded with essential purpose, then usage guidance. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple add-inventory tool with no output schema, the description covers core purpose, usage guidelines, and key trait (real write). Lacks return value info but is adequate for typical agent invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% per context, so description must compensate. Only mentions batch handling ('single-item array for one card') but does not explain inner fields like cardId, quantity, isFoil. Insufficient guidance for a 3-field object.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Add one or more cards to inventory') and differentiates from siblings by mentioning update_inventory and remove_inventory. It also explains the batch structure.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use alternatives: update_inventory for quantity changes, remove_inventory for deletions. Also notes auth requirement (IWMM_API_KEY) and emphasizes this is a real write.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/matthewdtowles/iwantmymtg-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server