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 finden

So sehen Partner und Systemhersteller, welche Snoopr MCP Apps für ihren Client freigeschaltet sind.

Der erste praktische Schritt in Snoopr AI Access ist meist tools/list. Damit sehen Sie, welche MCP Apps und Funktionen für Ihren Client, Ihre Partnerschaft oder Ihren Vertriebsfall tatsächlich freigeschaltet sind.

Snoopr MCP Apps können von Snoopr selbst oder von Partnern stammen. Sichtbar werden jedoch nur die Funktionen, die für Ihren Client verfügbar gemacht wurden.

Was Sie in tools/list sehen

  • Nur die Funktionen, für die Ihr Token berechtigt ist.
  • Name und Beschreibung der MCP App oder Funktion.
  • Das Input-Schema, damit Aufrufe korrekt gebaut werden können.
  • Optional UI-bezogene Metadaten, wenn eine Funktion eine Oberfläche mitbringt.

Warum das aus Client-Sicht wichtig ist

  • Maklersysteme können dynamisch erkennen, welche MCP Apps verfügbar sind.
  • Partnerportale können nur freigegebene Funktionen anzeigen.
  • AI-Anwendungen können ihren nächsten Schritt am verfügbaren Toolset ausrichten.
  • Änderungen am Zugriff lassen sich zentral über Snoopr AI Access steuern.
Wenn nach initialize eine mcp-session-id zurückkommt, sollte diese beitools/list mitgesendet und für die folgenden Aufrufe wiederverwendet werden.

Snoopr Besonderheiten

  • Verwenden Sie immer exakt den Tool-Namen, den tools/list liefert.
  • Zusätzliche Metadaten in _meta können UI- oder Plattformhinweise enthalten.
  • Diese Zusatzfelder sind Snoopr-Erweiterungen und nicht Teil des MCP-Pflichtkerns.
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 listTools(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,
  );

  return {
    serverInfo: init.body.result?.serverInfo,
    tools: list.body.result?.tools || [],
  };
}
Snoopr MCP Gateway