MCP-Server
Der MCP-Server stellt die Suche als Tools fuer AI-Assistenten bereit (Model Context Protocol).
Verwendung
import { createMcpSearchServer } from '@processcube-io/knowledge-sdk/mcp/server';
const mcp = await createMcpSearchServer(store, {
name: 'my-docs',
version: '1.0.0',
baseUrl: 'https://docs.example.com',
collectionDescriptions: {
docs: 'Hauptdokumentation',
blog: 'Blog-Artikel und Tutorials',
},
searchToolDescription: 'Durchsucht die Projekt-Dokumentation.',
listCollectionsToolDescription: 'Listet alle verfuegbaren Collections auf.',
});Tools
search_docs
Durchsucht die Dokumentation.
| Parameter | Typ | Beschreibung |
|---|---|---|
query | string | Suchbegriff |
collection | string (optional) | Collection-Filter |
limit | number (1-50) | Max. Ergebnisse (Default: 10) |
list_collections
Listet alle verfuegbaren Collections mit Dokumentanzahl und Beschreibung auf.
Strukturierte Antworten
Seit KnowledgeSDK v2.0.0 liefert jedes Tool neben dem menschenlesbaren Text
auch structuredContent — und deklariert dafuer ein outputSchema. Das
Schema ist der eigentliche Punkt: ohne es hat ein generischer MCP-Client keine
Moeglichkeit zu erfahren, dass strukturierte Daten vorliegen, und ignoriert sie.
search_docs — entspricht der REST-SearchResponse:
{
results: Array<{
id: string;
title: string;
path: string;
collection: string;
snippet: string;
score: number;
}>;
query: string;
collection: string | null; // null, wenn ohne Filter gesucht wurde
total: number;
duration_ms: number;
}list_collections:
{
collections: Array<{ name: string; doc_count: number; description?: string }>;
total: number;
}get_document — die DocumentResponse plus absolute url:
{
id: string;
title: string;
path: string;
url: string;
collection: string;
body: string;
body_length: number;
truncated: boolean;
}classify_ticket liefert das vollstaendige ClassifyResult,
classify_ticket_feedback ein { saved, correlationId, correctCollection, correctSubTheme? }.
Ein deklariertes outputSchema wird validiert — auf Server- und auf
Client-Seite. Liefert ein eigener SearchStore eine unvollstaendige
SearchResponse (etwa ohne score), ist das Ergebnis ab v2.0.0 ein
sichtbarer Tool-Fehler statt einer stillschweigend durchgereichten Antwort.
Die bisherige Textausgabe bleibt fuer bestehende MCP-Clients unveraendert
erhalten. Fuer maschinelle Verarbeitung ist structuredContent vorzuziehen.
get_document
Holt ein einzelnes Dokument im Volltext — der zweite Schritt, wenn der Auszug
aus search_docs fuer die Antwort nicht reicht.
| Parameter | Typ | Beschreibung |
|---|---|---|
id | string | Dokument-ID aus einem search_docs-Treffer (Feld ID) |
maxBytes | number (1000-500000, optional) | Obergrenze fuer den Body (Default: 100000) |
Das Tool wird nur registriert, wenn der Store getDocument anbietet. Bei einer
eigenen SearchStore-Implementierung ohne diese Methode bleibt die Tool-Liste
unveraendert — bestehende MCP-Clients sehen also keine Aenderung.
search_docs gibt zu jedem Treffer eine Zeile **ID:** qmd://… aus, damit ein
Agent den Treffer direkt nachladen kann.
classify_ticket
Klassifiziert ein Ticket und ordnet es der passenden Collection, dem Sub-Thema
und dem Quell-Repository zu. Wird nur aktiviert, wenn classifierConfig uebergeben wird.
| Parameter | Typ | Beschreibung |
|---|---|---|
correlationId | string | Stabiler Schluessel (z.B. “org/repo#123”) |
title | string | Ticket-Titel |
body | string (optional) | Ticket-Beschreibung |
tags | string[] (optional) | Tags/Markierungen |
repo | string (optional) | Quell-Repository |
classify_ticket_feedback
Gibt Feedback zu einer vorherigen Klassifikation. Verbessert zukuenftige Klassifikationen.
| Parameter | Typ | Beschreibung |
|---|---|---|
correlationId | string | correlationId aus dem classify_ticket Request |
correctCollection | string | Die korrekte Collection |
correctSubTheme | string (optional) | Korrektes Sub-Thema |
comment | string (optional) | Begruendung der Korrektur |
Siehe Ticket-Classifier Dokumentation fuer Details.
Integration
Im Standalone-Server
await startServer(store, {
port: 3001,
mcp: {
name: 'my-docs',
baseUrl: 'https://docs.example.com',
collectionDescriptions: { docs: 'Dokumentation' },
},
});
// POST /api/mcp → MCP-EndpointIn Next.js
// app/api/mcp/route.ts
import { createMcpSearchServer } from '@processcube-io/knowledge-sdk/mcp/server';
import { WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js';
export async function POST(req: Request) {
const mcp = await createMcpSearchServer(store, { name: 'my-docs' });
const transport = new WebStandardStreamableHTTPServerTransport({
sessionIdGenerator: undefined,
enableJsonResponse: true,
});
await mcp.connect(transport);
try {
return await transport.handleRequest(req);
} finally {
await transport.close();
await mcp.close();
}
}Konfiguration
| Option | Default | Beschreibung |
|---|---|---|
name | 'knowledge-sdk' | Server-Name im MCP-Protokoll |
version | '1.0.0' | Server-Version |
baseUrl | '' | Basis-URL fuer absolute Links |
collectionDescriptions | {} | Beschreibungen pro Collection |
searchToolDescription | (generisch) | Beschreibung des search_docs Tools |
listCollectionsToolDescription | (generisch) | Beschreibung des list_collections Tools |
getDocumentToolDescription | (generisch) | Beschreibung des optionalen get_document Tools |
classifierConfig | undefined | Ticket-Classifier-Konfiguration (aktiviert classify_ticket Tools) |
feedbackStore | undefined | Feedback-Store fuer Self-Improvement |