Stacklane je sada Vantion LabsSaznajte više

Početni paket za MCP server: siguran pristup AI agenata internim sistemima

Ovaj početni paket koristimo kada agentu treba pristup internim sistemima kao što su CRM, ERP ili repozitorij dokumenata. Od prvog commita dobijate Model Context Protocol server u TypeScriptu, zasnovan na Effectu, s prijavom, ograničenim pravima i zapisom svakog poziva.

Šta sadrži

Kako dijelovi rade zajedno

  1. 01

    Povezivanje

    MCP klijent, na primjer Claude, Cursor ili interni agent, povezuje se preko streamable HTTP-a. Bez tokena biva upućen na vaš identity provider i tamo završava OAuth prijavu.

  2. 02

    Autorizacija

    Server provjerava token pomoću objavljenih ključeva providera, ili pronalazi API ključ, i provjerava ovlast koju alat traži.

  3. 03

    Izvršenje

    Alat poziva interni sistem preko malog klijenta koji prenosi ko je pozivalac, uz ograničenja broja poziva i vremenska ograničenja.

  4. 04

    Zapis

    Poziv se upisuje u revizijski log, a tipiziran rezultat vraća se agentu.

Pogled u kod

Alat samo za čitanje s tipiziranim rezultatom, provjerom ovlasti i zapisom u revizijskom logu.

TypeScript
import { Effect, Schema } from "effect";
import { Tool, Toolkit } from "effect/unstable/ai";
import { CrmClient, Customer, CustomerNotFound } from "./CrmClient.ts";
import { GuardFailures, ToolGuard } from "../tools/ToolGuard.ts";

const GetCustomer = Tool.make("get_customer", {
  description: "Look up a customer by id.",
  parameters: Schema.Struct({ customerId: Schema.String }),
  success: Customer,
  failure: Schema.Union([CustomerNotFound, ...GuardFailures]),
}).annotate(Tool.Readonly, true);

export const CrmToolkit = Toolkit.make(GetCustomer);

export const CrmToolkitLive = CrmToolkit.toLayer(
  Effect.gen(function*() {
    const guard = yield* ToolGuard;
    const crm = yield* CrmClient;
    return CrmToolkit.of({
      // Checks crm:read, applies the rate and time limits, writes the audit entry.
      get_customer: (params) =>
        guard.run(
          { tool: "get_customer", scope: "crm:read", arguments: params },
          () => crm.getCustomer(params.customerId),
        ),
    });
  }),
);

Tehnologije

Sve tehnologije

Razgovarajte s osnivačem o jednom procesu