Snoopr
SnooprFür Partner & Integratoren

Snoopr Docs

Leitfäden für Partner, die Leistungen von Produktgebern über Snoopr AI Access in eigene Anwendungen und agentische Systeme einbinden.

Die Dokumentation zeigt, wie Vertriebspartner, Kooperationspartner, Maklersysteme und Plattformen verfügbare MCP Apps finden, sicher nutzen und in eigene Prozesse integrieren. Anbieter können dieselbe Umgebung außerdem für Tests vor dem Rollout verwenden.

Für Service Consumer

Im Fokus stehen Vertriebs- und Kooperationspartner, die Leistungen der Anbieter in Maklersystemen, Partnerportalen, Plattformen und AI-Anwendungen einsetzen wollen.

Für Service Provider

Dieselbe Dokumentation und Sandbox unterstützen auch Anbieter dabei, eigene BiPRO-Dienste und MCP-Schnittstellen vor Freischaltung und Rollout mit Snoopr AI Access zu prüfen.

MCP Apps nutzen

So rufen Sie freigeschaltete Snoopr MCP Apps in Ihren Prozessen, Systemen oder AI-Anwendungen auf.

Sobald Ihre Anwendung eine Funktion kennt, kann sie diese über tools/call nutzen. Genau so werden Angebote, Produktlogik oder Entscheidungsprozesse aus Snoopr AI Access in Maklersysteme, Partnerportale oder AI-Anwendungen eingebunden.

Der Bearer-Token wird bei jedem Request mitgesendet. Falls eine MCP-Session-ID zurückkommt, sollte sie für die folgenden Aufrufe übernommen werden.

Worauf Clients achten sollten

  • Immer exakt den Namen aus tools/list verwenden.
  • Die arguments passend zum dort gelieferten Input-Schema aufbauen.
  • Keine festen Annahmen über Tool-Namen oder Schemata treffen.
  • Antworten können neben fachlichen Daten auch zusätzliche UI-Hinweise enthalten.

Was im Hintergrund passiert

  • Ihr System ruft eine freigeschaltete Funktion über Snoopr AI Access auf.
  • Das Gateway prüft Token und Berechtigungen.
  • Danach wird die Anfrage an die eigentliche Anbieter-App oder MCP App weitergeleitet.
  • Die Antwort kommt über Snoopr AI Access wieder an Ihr System zurück.
Für robuste Integrationen empfiehlt sich ein klarer Ablauf: zuerst tools/list, danachtools/call mit den passenden Argumenten und derselben Session.
const gatewayUrl = "https://mcp.snoopr.de";

function parseRpcResponse(rawText, contentType = "") {
  const text = (rawText || "").trim();
  if (!text) throw new Error("Leere Antwort vom Gateway");

  try {
    return JSON.parse(text);
  } catch {}

  const looksLikeSse = contentType.includes("text/event-stream") || text.includes("\ndata:");
  if (!looksLikeSse) throw new Error("Antwort ist weder JSON noch SSE");

  const chunks = text.split(/\n\n+/);
  for (const chunk of chunks) {
    const dataLines = chunk
      .split("\n")
      .map((line) => line.trim())
      .filter((line) => line.startsWith("data:"))
      .map((line) => line.slice(5).trim());

    if (!dataLines.length) continue;
    const data = dataLines.join("\n");
    if (!data || data === "[DONE]") continue;

    try {
      return JSON.parse(data);
    } catch {}
  }

  throw new Error("SSE-Antwort enthaelt kein parsebares JSON");
}

async function postMcp(accessToken, payload, sessionId) {
  const response = await fetch(`${gatewayUrl}/mcp`, {
    method: "POST",
    headers: {
      Authorization: `Bearer ${accessToken}`,
      "Content-Type": "application/json",
      Accept: "application/json, text/event-stream",
      "mcp-protocol-version": "2025-11-25",
      ...(sessionId ? { "mcp-session-id": sessionId } : {}),
    },
    body: JSON.stringify(payload),
  });

  const text = await response.text();
  const contentType = response.headers.get("content-type") || "";
  if (!response.ok) {
    throw new Error(`MCP request failed (${response.status}): ${text.slice(0, 240)}`);
  }

  return {
    body: parseRpcResponse(text, contentType),
    sessionId: response.headers.get("mcp-session-id") || sessionId || undefined,
  };
}

async function callTool(accessToken) {
  const init = await postMcp(accessToken, {
    jsonrpc: "2.0",
    id: 1,
    method: "initialize",
    params: {
      protocolVersion: "2025-11-25",
      capabilities: {},
      clientInfo: { name: "Docs Example", version: "1.0.0" },
    },
  });

  const list = await postMcp(
    accessToken,
    { jsonrpc: "2.0", id: 2, method: "tools/list", params: {} },
    init.sessionId,
  );

  const tools = Array.isArray(list.body?.result?.tools) ? list.body.result.tools : [];
  const toolName = tools.find((tool) => typeof tool?.name === "string")?.name;
  if (!toolName) throw new Error("Kein aufrufbares Tool gefunden.");

  const result = await postMcp(
    accessToken,
    {
      jsonrpc: "2.0",
      id: 3,
      method: "tools/call",
      params: { name: toolName, arguments: {} },
    },
    init.sessionId,
  );

  return result.body.result;
}
Snoopr MCP Gateway