Skip to content

Latest commit

 

History

History
178 lines (108 loc) · 4.34 KB

File metadata and controls

178 lines (108 loc) · 4.34 KB

Examples

These examples show how to use ProDisco as a library-agnostic MCP server: you configure libraries, search their APIs, and execute code in the sandbox.

This directory includes runnable library config files:

  • prodisco.postgres.yaml (uses pg-mem)
  • prodisco.kubernetes.yaml (uses @kubernetes/client-node)
  • prodisco.javascript.yaml (uses my-esm-js-lib, an ESM-only JavaScript example)

Note: ProDisco indexes APIs from TypeScript declaration files (.d.ts) when available. If a library ships no .d.ts, ProDisco can fall back to indexing ESM JavaScript source (best-effort; types default to any). CommonJS-only packages without typings are not supported.


Example 1: Postgres (local, no external services) with pg-mem

This example is intentionally easy to run locally: it uses an in-memory Postgres implementation, so you don’t need Docker or a real database.

1) Config

Use: examples/prodisco.postgres.yaml (this repo ships it).

2) Install / build

Run ProDisco (missing packages are auto-installed):

node dist/server.js --config examples/prodisco.postgres.yaml

Or build images with the library baked in:

npm run docker:build:config -- --config examples/prodisco.postgres.yaml

3) Discover the API

Call prodisco.searchTools with:

  • methodName: "newDb"
  • library: "pg-mem"

4) Execute in sandbox

Run with prodisco.runSandbox:

const { newDb } = require("pg-mem");

const db = newDb();
db.public.none("create table users(id int primary key, name text);");
db.public.none("insert into users values (1, 'ada'), (2, 'grace');");

const rows = db.public.many("select * from users order by id;");
console.log(JSON.stringify(rows));

Expected output:

[{"id":1,"name":"ada"},{"id":2,"name":"grace"}]

Example 2: Kubernetes (cluster-backed) with @kubernetes/client-node

This example shows how to configure ProDisco to work with a Kubernetes cluster by indexing and allowing the Kubernetes client library.

1) Config

Use: examples/prodisco.kubernetes.yaml (this repo ships it).

2) Install / build

Run ProDisco (missing packages are auto-installed):

node dist/server.js --config examples/prodisco.kubernetes.yaml

Or build images with the library baked in:

npm run docker:build:config -- --config examples/prodisco.kubernetes.yaml

3) Ensure the sandbox has Kubernetes credentials

  • Local subprocess: @kubernetes/client-node will load credentials from KUBECONFIG or ~/.kube/config.
  • Containers/pods: mount a kubeconfig into the sandbox container (and set KUBECONFIG) or run with in-cluster credentials.

4) Discover the API

Call prodisco.searchTools with:

  • methodName: "listNamespace" (or methodName: "listPod")
  • library: "@kubernetes/client-node"

5) Execute in sandbox

Run with prodisco.runSandbox:

const k8s = require("@kubernetes/client-node");

const kc = new k8s.KubeConfig();
kc.loadFromDefault();

const coreApi = kc.makeApiClient(k8s.CoreV1Api);
const res = await coreApi.listNamespace();

const names = (res.body.items || [])
  .map((ns: any) => ns.metadata?.name)
  .filter(Boolean);

console.log(JSON.stringify(names, null, 2));

Example 3: JavaScript (ESM-only, no typings) with my-esm-js-lib

This example demonstrates indexing a JavaScript-only ESM library that ships no .d.ts. The library is a tiny local fixture shipped in this repo at examples/my-esm-js-lib/.

1) Install the example library

Install the local package into your project node_modules (do this once):

npm install ./examples/my-esm-js-lib

2) Config

Use: examples/prodisco.javascript.yaml (this repo ships it).

3) Run ProDisco

Run ProDisco (this example library is local, so auto-install will skip it):

node dist/server.js --config examples/prodisco.javascript.yaml

4) Discover the API

Call prodisco.searchTools with:

  • methodName: "publicFn" (or methodName: "MyClass")
  • library: "my-esm-js-lib"

You should not see internal/non-exported symbols (e.g. nonExportedFn, Internal).

5) Execute in sandbox

Run with prodisco.runSandbox:

const lib = require("my-esm-js-lib");

console.log(lib.foo());
console.log(lib.publicFn());

const c = new lib.MyClass();
console.log(c.greet("ada"));

Expected output:

1
2
hi ada