Skip to main content
Glama
pepesto-solutions

Pepesto MCP Server

Official

Pepesto Oneshot (recipe → cart)

pepesto_oneshot

Convert recipe URLs, plain text, or an image into a checkout-ready cart for a chosen European supermarket, returning a redirect URL for payment verification.

Instructions

One-shot: turn recipe URLs, free-form text, and/or an image into a ready-to-checkout cart for a chosen European supermarket. Returns a redirect_url that opens the Pepesto checkout UI for the user to verify and pay. Internally runs parse + products + session (not exposed to agents) with Pepesto's heuristics. Use this when you want the simplest end-to-end flow; use pepesto_parse + pepesto_products + session (not exposed to agents) for finer control.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
content_urlsNoRecipe URLs to parse and shop.
content_textNoFree-form shopping list or extra items to include.
content_imageNoBase64-encoded recipe image.
supermarket_domainNoSupermarket domain or ID, e.g. 'coop.ch', 'tesco.com', 'ah.nl'. See README for the full list.

Implementation Reference

  • The actual handler function for the pepesto_oneshot tool. It calls client.post('/oneshot', args) via the runTool helper, which sends the request to the Pepesto API and wraps the result in the standard ToolResult format.
    async (args) =>
      runTool(() => client.post("/oneshot", args)),
  • Input schema for pepesto_oneshot: content_urls (optional array of URLs), content_text (optional free-form text), content_image (optional base64 image), and supermarket_domain (optional validated via SupermarketDomain schema).
    inputSchema: {
      content_urls: z
        .array(z.string().url())
        .optional()
        .describe("Recipe URLs to parse and shop."),
      content_text: z
        .string()
        .optional()
        .describe("Free-form shopping list or extra items to include."),
      content_image: z
        .string()
        .optional()
        .describe("Base64-encoded recipe image."),
      supermarket_domain: SupermarketDomain.optional(),
    },
  • Registration of the 'pepesto_oneshot' tool via server.registerTool() in the registerOneshotTool function, including its title, description, inputSchema, and handler.
    export function registerOneshotTool(server: McpServer, client: PepestoClient): void {
      server.registerTool(
        "pepesto_oneshot",
        {
          title: "Pepesto Oneshot (recipe → cart)",
          description:
            "One-shot: turn recipe URLs, free-form text, and/or an image into a ready-to-checkout " +
            "cart for a chosen European supermarket. Returns a redirect_url that opens the Pepesto " +
            "checkout UI for the user to verify and pay. Internally runs parse + products + session " +
            "(not exposed to agents) with Pepesto's heuristics. Use this when you want the simplest " +
            "end-to-end flow; use pepesto_parse + pepesto_products + session (not exposed to agents) " +
            "for finer control.",
          inputSchema: {
            content_urls: z
              .array(z.string().url())
              .optional()
              .describe("Recipe URLs to parse and shop."),
            content_text: z
              .string()
              .optional()
              .describe("Free-form shopping list or extra items to include."),
            content_image: z
              .string()
              .optional()
              .describe("Base64-encoded recipe image."),
            supermarket_domain: SupermarketDomain.optional(),
          },
        },
        async (args) =>
          runTool(() => client.post("/oneshot", args)),
      );
    }
  • src/server.ts:23-23 (registration)
    Import and invocation of registerOneshotTool(server, client) in createServer(), wiring the tool registration into the MCP server.
    registerOneshotTool(server, client);
  • The PepestoClient.post() method that the handler uses to make the actual HTTP POST request to the Pepesto API endpoint '/oneshot'.
    async post<T = unknown>(endpoint: string, body: unknown): Promise<T> {
      if (!this.apiKey) {
        throw new Error(
          "PEPESTO_API_KEY is not set. See the README (\"Getting an API key\") for how to " +
            "obtain one.",
        );
      }
      const path = endpoint.startsWith("/") ? endpoint : `/${endpoint}`;
      const url = `${this.baseUrl}${path}`;
    
      const headers: Record<string, string> = {
        "Content-Type": "application/json",
        Accept: "application/json",
        Authorization: `Bearer ${this.apiKey}`,
      };
    
      const res = await this.fetchImpl(url, {
        method: "POST",
        headers,
        body: JSON.stringify(body ?? {}),
      });
    
      const text = await res.text();
      if (!res.ok) {
        throw new PepestoApiError(res.status, path, text);
      }
      if (!text) {
        return {} as T;
      }
      try {
        return JSON.parse(text) as T;
      } catch {
        return text as unknown as T;
      }
    }
Behavior3/5

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

With no annotations provided, the description carries full burden for behavioral disclosure. It mentions internal steps (parse + products + session) and that it returns a redirect_url, but does not cover error handling, idempotency, authentication needs, or potential side effects beyond cart creation. While the core behavior is described, more detail would improve 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?

The description is four sentences, each serving a purpose: purpose, output, internal process, usage guidance. It is front-loaded with the main action and efficiently conveys all needed information without redundancy.

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?

Given the tool's complexity (multiple input types, single output) and the lack of output schema or annotations, the description provides adequate context: what it does, what it returns, and when to use alternatives. However, it could be more complete by mentioning possible failure modes or prerequisites, but overall it is sufficient for agent decision-making.

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

Parameters3/5

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

All four parameters are described in the input schema (100% coverage). The description loosely maps inputs to parameters (recipe URLs, free-form text, image) and gives an example for supermarket_domain, but this adds only minor context beyond the schema. Baseline 3 is appropriate.

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 tool's purpose: turning recipe URLs, free-form text, and/or an image into a ready-to-checkout cart for a European supermarket. It specifies the output (redirect_url) and distinguishes itself from siblings by noting it internally runs parse+products+session, and recommends pepesto_parse+pepesto_products for finer control.

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?

The description explicitly tells when to use this tool ('simplest end-to-end flow') and when to use alternatives ('pepesto_parse + pepesto_products + session for finer control'). This provides clear guidance for the agent to choose appropriately.

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/pepesto-solutions/pepesto-mcp'

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