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.
Worauf Clients achten sollten
- Immer exakt den Namen aus
tools/listverwenden. - Die
argumentspassend 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.
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;
}