Ich habe die Möglichkeit, einen MCP -Server für eine Observierbarkeitsanwendung zu erstellen, um dem AI -Agenten dynamische Codesanalysefunktionen bereitzustellen. Aufgrund seines Potenzials, Anwendungen zu transformieren, ist MCP eine Technologie, über die ich noch ekstatischer bin als ich ursprünglich um Genai im Allgemeinen. Ich habe mehr darüber und einige Intro an MCPS im Allgemeinen in einem früheren geschrieben Submit.

Während ein anfänglicher POCs zeigte, dass es eine gab immens Das Potenzial, dass dies ein Kraftmultiplikator für den Wert unseres Produkts darstellt, dauerte es mehrere Iterationen und mehrere Stolperfaktoren, um dieses Versprechen zu erfüllen. In diesem Beitrag werde ich versuchen, einige der gewonnenen Lektionen zu erfassen, da ich denke, dass dies anderen MCP -Server -Entwicklern zugute kommen kann.

Mein Stapel

  • Ich habe benutzt Cursor Und VSCODE zeitweise als Haupt MCP -Shopper
  • Um den MCP -Server selbst zu entwickeln, habe ich das verwendet .NET MCP SDKals ich mich entschied, den Server auf einem anderen in .NET geschriebenen Dienst zu hosten

Lektion 1: Lassen Sie nicht alle Ihre Daten auf den Agenten abgeben

In meiner Anwendung gibt ein Instrument aggregierte Informationen zu Fehlern und Ausnahmen zurück. Die API ist sehr detailliert, da sie eine komplexe UI -Ansicht dient und große Mengen von tief verknüpften Daten ausspricht:

  • Fehlerrahmen
  • Betroffene Endpunkte
  • Stapelspuren
  • Priorität und Tendencies
  • Histogramme

Meine erste Vermutung warfare es, die API einfach aufzudecken wie ist als MCP -Instrument. Schließlich sollte der Agent in der Lage sein, mehr Sinn als jede Benutzeroberfläche zu erkennen und sich mit interessanten Particulars oder Verbindungen zwischen Ereignissen zu befassen. Es gab mehrere Szenarien, die ich im Sinn hatte, wie ich erwarten würde, dass diese Daten nützlich sind. Der Agent könnte automatisch Korrekturen für jüngste Ausnahmen anbieten, die in der Produktion oder in der Testumgebung aufgezeichnet wurden, mich über Fehler informieren, die sich hervorheben, oder helfen mir, einige systematische Probleme anzugehen, die die Grundursache für die Probleme darstellen.

Die grundlegende Prämisse bestand daher darin, dem Agenten zu ermöglichen, seine „Magie“ zu bearbeiten, wobei mehr Daten möglicherweise mehr Hooks für den Agenten bedeuten, um sich in seinen Untersuchungsbemühungen zu verringern. Ich habe schnell einen Wrapper um unsere API am MCP -Endpunkt codiert und beschloss, mit einer grundlegenden Aufforderung zu beginnen, ob alles funktioniert:

Bild des Autors

Wir können sehen, dass der Agent klug genug warfare, um zu wissen, dass es ein weiteres Instrument anrufen musste, um die Umgebungs -ID dafür zu erfassen. ‚prüfen‚Umgebung, die ich erwähnt habe. Nachdem dies in den letzten 24 Stunden festgestellt hatte, dass es in den letzten 24 Stunden tatsächlich keine Ausnahme gab, dauerte es die Freiheit, einen längeren Zeitraum zu scannen, und dann wurde es ein wenig seltsam:

Bild des Autors

Was für eine seltsame Antwort. Der Agent wechselt nach Ausnahmen aus den letzten sieben Tagen, erzielt diesmal einige materielle Ergebnisse und fordert dennoch weiter, als ob Sie die Daten insgesamt ignorieren. Es versucht weiterhin zu versuchen, das Instrument auf unterschiedliche Weise und unterschiedliche Parameterkombinationen zu verwenden, die offensichtlich fummeln, bis ich feststellte, dass die Daten dafür völlig unsichtbar sind. Während Fehler in der Antwort wieder gesendet werden, behauptet der Agent tatsächlich, dass es dort gibt Keine Fehler. Was ist los?

Bild des Autors

Nach einigen Untersuchungen wurde herausgestellt, dass das Drawback die Tatsache warfare, dass wir einfach eine Obergrenze in der Fähigkeit des Agenten erreicht haben, große Datenmengen in der Antwort zu verarbeiten.

Ich habe eine extrem ausführliche API verwendet, die ich ursprünglich sogar als Vorteil betrachtete. Das Endergebnis warfare jedoch, dass ich es irgendwie geschafft habe, das Modell zu überwältigen. Insgesamt gab es rund 360.000 Charaktere und 16.000 Wörter in der Antwort JSON. Dies beinhaltet Anrufstapel, Fehlerrahmen und Referenzen. Das sollen wurden nur durch Betrachtung der Kontextfenstergrenze für das von mir verwendete Modell unterstützt (Claude 3.7 Sonett sollte bis zu 200 Okay -Token unterstützen), aber der große Datenablager hat den Agenten dennoch gründlich stumpft.

Eine Strategie wäre, das Modell in eine zu ändern, die ein noch größeres Kontextfenster unterstützt. Ich wechselte auf die Gemini 2.5 Professional Modell, um diese Theorie zu testen, da es eine unerhörte Grenze von einer Million Token hat. Sicher genug, die gleiche Frage ergab jetzt eine viel intelligentere Reaktion:

Bild des Autors

Das ist großartig! Der Agent konnte die Fehler analysieren und die systematische Ursache vieler von ihnen mit einiger grundlegender Begründung finden. Wir können uns jedoch nicht darauf verlassen, dass der Benutzer ein bestimmtes Modell verwendet, und um Dinge zu komplizieren, wurde dies aus einer relativ niedrigen Bandbreiten -Testumgebung ausgegeben. Was wäre, wenn der Datensatz noch größer wäre?
Um dieses Drawback zu lösen, habe ich einige grundlegende Änderungen an der Struktur der API vorgenommen:

  • Verschachtelte Datenhierarchie: Halten Sie die anfängliche Antwort auf hochrangige Particulars und Aggregationen. Erstellen Sie eine separate API, um die Anrufstapel bestimmter Frames nach Bedarf abzurufen.
  • Verbesserung der Abfragbarkeit: Alle bisher von dem Agent vorgenommenen Abfragen verwendeten eine sehr kleine Seitengröße für die Daten (10). Wenn wir möchten, dass der Agent in der Lage ist, relevantere Teilmengen der Daten zugreifen, um mit den Einschränkungen seines Kontextes zu passen, müssen wir mehr APIs für Abfragefehler anhand verschiedener Dimensionen, beispielsweise betroffen: betroffene Methoden, Fehlertyp, Priorität und Einfluss usw. angeben.

Mit den neuen Änderungen analysiert das Instrument nun konsequent wichtige neue Ausnahmen und erstellt Fixvorschläge. Ich warf einen anderen kleinen Element, das ich sortieren musste, bevor ich es wirklich zuverlässig verwenden konnte.

Lektion 2: Wie ist es Zeit?

Bild des Autors mit Midjourney erzeugt

Der Leser mit Kree-Eyed-Leser hat möglicherweise festgestellt, dass der Agent im vorherigen Beispiel die Fehler in einem bestimmten Zeitbereich verwendet ISO 8601 Zeitdauer Format anstelle der tatsächlichen Daten und Zeiten. Additionally anstatt Normal einzubeziehen ‚Aus‚ Und ‚Zu‚Parameter mit DateTime -Werten, die KI sendete beispielsweise sieben Tage oder einen Dauerwert, zum Beispiel sieben Tage oder P7d, Um anzuzeigen, möchte es in der vergangenen Woche auf Fehler suchen.

Der Grund dafür ist etwas seltsam – Der Agent kennt das aktuelle Datum und die aktuelle Uhrzeit nicht! Sie können dies selbst überprüfen, indem Sie dem Agenten diese einfache Frage stellen. Das folgende hätte Sinn gemacht, wenn ich nicht die Tatsache, dass ich diese Eingabeaufforderung gegen Mittag am 4. Mai tippte…

Bild des Autors

Zeit verwenden Dauer Die Werte stellten sich als großartige Lösung heraus, die der Agent ziemlich intestine behandelte. Vergessen Sie jedoch nicht, den erwarteten Wert und die Beispielsyntax in der Beschreibung des Toolparameters zu dokumentieren!

Lektion 3: Wenn der Agent einen Fehler macht, zeigen Sie ihm, wie man es besser macht

Im ersten Beispiel warfare ich tatsächlich überrascht, wie der Agent die Abhängigkeiten zwischen den verschiedenen Toolaufrufen entschlüsseln konnte, um die richtige Umgebungskennung bereitzustellen. Bei der Untersuchung des MCP -Vertrags wurde herausgefunden, dass ein anderes Instrument von einem abhängigen Instrument anrufen musste, um die Liste der Umgebungs -IDs zuerst zu erhalten.

Als Reaktion auf andere Anfragen nahm der Agent jedoch manchmal die in der forderten wörtlichen genannten Umgebungsnamen auf. Zum Beispiel bemerkte ich das als Antwort auf diese Frage: Vergleichen Sie langsame Spuren für diese Methode zwischen den Take a look at- und Produktumgebungen. Gibt es signifikante Unterschiede? Abhängig vom Kontext, Der Agent verwendete manchmal die in der Anfrage genannten Umgebungsnamen und sendete die Zeichenfolgen „Take a look at“ und „Prod“ als Umgebungs -ID.

In meiner ursprünglichen Implementierung würde mein MCP -Server in diesem Szenario stillschweigend versagen und eine leere Antwort zurückgeben. Der Agent würde nach Erhalt keines Daten oder eines generischen Fehlers einfach beenden und versuchten, die Anforderung mit einer anderen Strategie zu lösen. Um dieses Verhalten auszugleichen, habe ich meine Implementierung schnell geändert, so dass die JSON -Antwort genau beschreiben würde, was schief gelaufen ist, und sogar eine gültige Liste möglicher Werte bereitzustellen, um dem Agenten einen anderen Instrument -Aufruf zu speichern.

Bild des Autors

Dies warfare genug für den Agenten, das aus seinem Fehler lernte, den Anruf mit dem richtigen Wert wiederholte und irgendwie auch vermieden wurde, den gleichen Fehler in der Zukunft zu machen.

Lektion 4: Konzentrieren Sie sich auf Benutzerabsichten und nicht auf Funktionen

Es ist zwar verlockend, einfach zu beschreiben, was die API tut, aber die generischen Begriffe ermöglichen es dem Agenten manchmal nicht ganz, die Artwork der Anforderungen zu erkennen, für die diese Funktionalität am besten gelten.

Nehmen wir ein einfaches Beispiel: Mein MCP -Server verfügt über ein Instrument, mit dem für jede Methode, jeder Endpunkt oder für jede Codesposition angegeben werden kann, wie es zur Laufzeit verwendet wird. Insbesondere wird die Verfolgungsdaten verwendet, um anzugeben, welche Anwendungsflüsse die spezifische Funktion oder Methode erreichen.

In der Originaldokumentation wurden diese Funktionalität einfach beschrieben:

(McpServerTool,
Description(
@"For this technique, see which runtime flows within the software
(together with different microservices and code not on this undertaking)
use this perform or technique.
This knowledge is predicated on analyzing distributed tracing."))
public static async Job<string> GetUsagesForMethod(IMcpService shopper,
(Description("The atmosphere id to verify for usages"))
string environmentId,
(Description("The title of the category. Present solely the category title with out the namespace prefix."))
string codeClass,
(Description("The title of the tactic to verify, should specify a particular technique to verify"))
string codeMethod)

Das obige stellt eine funktional genaue Beschreibung dessen dar, was dieses Instrument tut, aber es macht nicht unbedingt klar, für welche Arten von Aktivitäten es related sein könnte. Nachdem ich festgestellt hatte, dass der Agent dieses Instrument nicht für verschiedene Eingabeaufforderungen ausgewählt hatte, dachte ich, dass es ziemlich nützlich wäre, ich habe mich entschlossen, die Toolbeschreibung neu zu schreiben. Diesmal betonte ich die Anwendungsfälle:

(McpServerTool,
Description(
@"Discover out what's the how a particular code location is getting used and by
which different providers/code.
Helpful to be able to detect doable breaking modifications, to verify whether or not
the generated code will match the present usages,
to generate exams primarily based on the runtime utilization of this technique,
or to verify for associated points on the endpoints triggering this code
after any change to make sure it didnt affect it"

Die Aktualisierung des Textes half dem Agenten, zu verwirklichen Warum Die Informationen waren nützlich. Vor diesem Änderung würde der Agent beispielsweise das Instrument als Reaktion auf eine Eingabeaufforderung, die der folgenden ähnelt, nicht einmal auslösen. Jetzt ist es völlig nahtlos geworden, ohne dass der Benutzer direkt erwähnen muss, dass dieses Instrument verwendet werden sollte:

Bild des Autors

Lektion 5: Dokumentieren Sie Ihre JSON -Antworten

Der JSON -Normal unterstützt zumindest offiziell keine Kommentare. Das heißt, wenn der JSON alles, was der Agent hat, muss er einige Hinweise auf den Kontext der von Ihnen zurückgegebenen Daten fehlen. Zum Beispiel habe ich in meiner aggregierten Fehlerantwort die folgenden zurückgegeben Punktzahl Objekt:

"Rating": {"Rating":21,
"ScoreParams":{ "Occurrences":1,
"Development":0,
"Latest":20,
"Unhandled":0,
"Surprising":0}}

Ohne ordnungsgemäße Dokumentation wäre es jedem Nicht-Klebstoff-Agenten schwer zu verstehen, was diese Zahlen bedeuten. Zum Glück ist es einfach, zu Beginn der JSON -Datei ein Kommentarelement mit zusätzlichen Informationen zu den angegebenen Daten hinzuzufügen:

"_comment": "Every error comprises a hyperlink to the error hint,
which could be retrieved utilizing the GetTrace instrument,
details about the affected endpoints the code and the
related stacktrace.
Every error within the listing represents quite a few situations
of the identical error and is given a rating after its been
prioritized.
The rating displays the criticality of the error.
The quantity is between 0 and 100 and is comprised of a number of
parameters, every can contribute to the error criticality,
all are normalized in relation to the system
and the opposite strategies.
The rating parameters worth represents its contributation to the
total rating, they embody:

1. 'Occurrences', representing the variety of situations of this error
in comparison with others.
2. 'Development' whether or not this error is escalating in its
frequency.
3. 'Unhandled' represents whether or not this error is caught
internally or poropagates all the way in which
out of the endpoint scope
4. 'Surprising' are errors which might be in excessive chance
bugs, for instance NullPointerExcetion or
KeyNotFound",
"EnvironmentErrors":()

Auf diese Weise kann der Agent dem Benutzer erklären, was die Punktzahl bedeutet, wenn er fragt, aber auch diese Erklärung in seine eigenen Argumentation und Empfehlungen einspeisen.

Auswahl der richtigen Architektur: SSE vs Stdio,

Es gibt zwei Architekturen, die Sie bei der Entwicklung eines MCP -Servers verwenden können. Die häufigere und weit verbreitete Implementierung macht Ihren Server als verfügbar Befehl vom MCP -Shopper ausgelöst. Dies könnte ein CLI-ausgelösterter Befehl sein; NPX, DockerUnd Python sind einige häufige Beispiele. In dieser Konfiguration erfolgt die gesamte Kommunikation über den ProzessStdiound der Prozess selbst wird auf dem Shopper -Laptop ausgeführt. Der Shopper ist für die Instanziierung und Aufrechterhaltung des Lebenszyklus des MCP -Servers verantwortlich.

Bild des Autors

Diese clientseitige Architektur hat aus meiner Sicht einen wichtigen Nachteil: Da die MCP-Server-Implementierung vom Shopper auf der lokalen Maschine ausgeführt wird, ist es viel schwieriger, Updates oder neue Funktionen auszurüsten. Selbst wenn dieses Drawback irgendwie gelöst wird, würde die enge Kopplung zwischen dem MCP -Server und den Backend -APIs, von denen er in unseren Anwendungen abhängt, dieses Modell in Bezug auf Versioning und Vorwärts-/Rückwärtskompatibilität weiter komplizieren.

Aus diesen Gründen habe ich die zweite Artwork von MCP -Server ausgewählt – ein SSE Server wird als Teil unserer Anwendungsdienste gehostet. Dadurch wird jede Reibung vom Ausführen von CLI -Befehlen auf dem Shopper -Laptop entfernt und ermöglicht es mir, den MCP -Servercode zusammen mit dem von ihm konsumierten Anwendungscode zu aktualisieren und zu übertreffen. In diesem Szenario erhält der Kunde eine URL des SSE -Endpunkts, mit dem er interagiert. Obwohl nicht alle Kunden diese Possibility unterstützen, gibt es einen brillanten Kommandomcp auf dem Namen Supergateway Dies kann als Proxy für die SSE -Server -Implementierung verwendet werden. Das bedeutet, dass Benutzer weiterhin die weit verbreitete STDIO -Variante hinzufügen und die auf Ihrem SSE -Backend gehostete Funktionen weiterhin konsumieren können.

Bild des Autors

MCPs sind immer noch neu

Es gibt viel mehr Lektionen und Nuancen, diese täuschend einfache Technologie zu nutzen. Ich habe festgestellt, dass es eine große Lücke zwischen der Implementierung eines praktikablen MCP zu einem gibt, das sich tatsächlich in die Bedürfnisse der Benutzer und die Nutzungsszenarien integrieren kann, selbst über diejenigen, die Sie erwartet haben. Hoffentlich sehen wir, wie die Technologie reift, weitere Beiträge auf Greatest Practices.

Willst du eine Verbindung herstellen? Sie können mich auf Twitter erreichen @doppleware oder über LinkedIn.
Folge mir MCP Für die dynamische Codeanalyse unter Verwendung von Beobachtbarkeit bei https://github.com/digma-ai/digma-mcp-server

Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert