From 2db62b0ca290c9b27ee733f9a9fc3cf28d8bee5b Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 24 Mar 2025 00:46:06 +0800 Subject: [PATCH] feat: add support for JSON Schema in AIFunction inputSchema in addition to zod schemas --- docs/mint.json | 3 + examples/ai-sdk/package.json | 2 + packages/ai-sdk/src/ai-sdk.ts | 13 +- packages/core/src/create-ai-function.test.ts | 18 +- packages/core/src/create-ai-function.ts | 33 +- packages/core/src/fns.ts | 12 +- packages/core/src/schema.test.ts | 18 + packages/core/src/schema.ts | 32 +- packages/core/src/types.ts | 30 +- packages/dexter/src/dexter.ts | 14 +- packages/genkit/src/genkit.ts | 22 +- packages/mastra/src/mastra.ts | 28 +- packages/stdlib/package.json | 3 + packages/stdlib/src/index.ts | 3 + packages/xsai/src/xsai.ts | 14 +- pnpm-lock.yaml | 507 ++++++++++++++++++- pnpm-workspace.yaml | 2 + readme.md | 3 + 18 files changed, 687 insertions(+), 70 deletions(-) create mode 100644 packages/core/src/schema.test.ts diff --git a/docs/mint.json b/docs/mint.json index 4ba5c79..a33d9e6 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -56,11 +56,13 @@ "group": "Tools", "pages": [ "tools/apollo", + "tools/arxiv", "tools/bing", "tools/calculator", "tools/clearbit", "tools/dexa", "tools/diffbot", + "tools/duck-duck-go", "tools/e2b", "tools/exa", "tools/firecrawl", @@ -70,6 +72,7 @@ "tools/jina", "tools/leadmagic", "tools/midjourney", + "tools/mcp", "tools/novu", "tools/people-data-labs", "tools/perigon", diff --git a/examples/ai-sdk/package.json b/examples/ai-sdk/package.json index c8e2ef6..5a36623 100644 --- a/examples/ai-sdk/package.json +++ b/examples/ai-sdk/package.json @@ -9,9 +9,11 @@ }, "dependencies": { "@agentic/ai-sdk": "workspace:*", + "@agentic/mcp": "workspace:*", "@agentic/weather": "workspace:*", "@ai-sdk/openai": "catalog:", "ai": "catalog:", + "exit-hook": "^4.0.0", "openai": "catalog:", "zod": "catalog:" }, diff --git a/packages/ai-sdk/src/ai-sdk.ts b/packages/ai-sdk/src/ai-sdk.ts index 3feb9e0..01db994 100644 --- a/packages/ai-sdk/src/ai-sdk.ts +++ b/packages/ai-sdk/src/ai-sdk.ts @@ -1,5 +1,10 @@ -import { type AIFunctionLike, AIFunctionSet } from '@agentic/core' -import { tool } from 'ai' +import { + type AIFunctionLike, + AIFunctionSet, + asSchema, + isZodSchema +} from '@agentic/core' +import { jsonSchema, tool } from 'ai' /** * Converts a set of Agentic stdlib AI functions to an object compatible with @@ -13,7 +18,9 @@ export function createAISDKTools(...aiFunctionLikeTools: AIFunctionLike[]) { fn.spec.name, tool({ description: fn.spec.description, - parameters: fn.inputSchema, + parameters: isZodSchema(fn.inputSchema) + ? fn.inputSchema + : jsonSchema(asSchema(fn.inputSchema).jsonSchema), execute: fn.execute }) ]) diff --git a/packages/core/src/create-ai-function.test.ts b/packages/core/src/create-ai-function.test.ts index 12771bc..0600a6e 100644 --- a/packages/core/src/create-ai-function.test.ts +++ b/packages/core/src/create-ai-function.test.ts @@ -4,7 +4,9 @@ import { z } from 'zod' import { createAIFunction } from './create-ai-function' import { type Msg } from './message' -const fullName = createAIFunction( +// TODO: Add tests for passing JSON schema directly. + +const fullNameAIFunction = createAIFunction( { name: 'fullName', description: 'Returns the full name of a person.', @@ -20,11 +22,11 @@ const fullName = createAIFunction( describe('createAIFunction()', () => { test('exposes OpenAI function calling spec', () => { - expect(fullName.spec.name).toEqual('fullName') - expect(fullName.spec.description).toEqual( + expect(fullNameAIFunction.spec.name).toEqual('fullName') + expect(fullNameAIFunction.spec.description).toEqual( 'Returns the full name of a person.' ) - expect(fullName.spec.parameters).toEqual({ + expect(fullNameAIFunction.spec.parameters).toEqual({ properties: { first: { type: 'string' }, last: { type: 'string' } @@ -36,9 +38,9 @@ describe('createAIFunction()', () => { }) test('executes the function with JSON string', async () => { - expect(await fullName('{"first": "John", "last": "Doe"}')).toEqual( - 'John Doe' - ) + expect( + await fullNameAIFunction('{"first": "John", "last": "Doe"}') + ).toEqual('John Doe') }) test('executes the function with OpenAI Message', async () => { @@ -51,6 +53,6 @@ describe('createAIFunction()', () => { } } - expect(await fullName(message)).toEqual('Jane Smith') + expect(await fullNameAIFunction(message)).toEqual('Jane Smith') }) }) diff --git a/packages/core/src/create-ai-function.ts b/packages/core/src/create-ai-function.ts index 405ab4e..678259e 100644 --- a/packages/core/src/create-ai-function.ts +++ b/packages/core/src/create-ai-function.ts @@ -1,9 +1,6 @@ -import type { z } from 'zod' - import type * as types from './types' -import { parseStructuredOutput } from './parse-structured-output' +import { asSchema } from './schema' import { assert } from './utils' -import { zodToJsonSchema } from './zod-to-json-schema' /** * Create a function meant to be used with OpenAI tool or function calling. @@ -14,7 +11,10 @@ import { zodToJsonSchema } from './zod-to-json-schema' * The `spec` property of the returned function is the spec for adding the * function to the OpenAI API `functions` property. */ -export function createAIFunction, Output>( +export function createAIFunction< + InputSchema extends types.AIFunctionInputSchema, + Output +>( spec: { /** Name of the function. */ name: string @@ -29,7 +29,9 @@ export function createAIFunction, Output>( strict?: boolean }, /** Implementation of the function to call with the parsed arguments. */ - implementation: (params: z.infer) => types.MaybePromise + implementation: ( + params: types.inferInput + ) => types.MaybePromise ): types.AIFunction { assert(spec.name, 'createAIFunction missing required "spec.name"') assert( @@ -42,17 +44,22 @@ export function createAIFunction, Output>( 'createAIFunction "implementation" must be a function' ) + const strict = !!spec.strict + const inputSchema = asSchema(spec.inputSchema, { strict }) + /** Parse the arguments string, optionally reading from a message. */ - const parseInput = (input: string | types.Msg) => { + const parseInput = ( + input: string | types.Msg + ): types.inferInput => { if (typeof input === 'string') { - return parseStructuredOutput(input, spec.inputSchema) + return inputSchema.parse(input) } else { const args = input.function_call?.arguments assert( args, `Missing required function_call.arguments for function ${spec.name}` ) - return parseStructuredOutput(args, spec.inputSchema) + return inputSchema.parse(args) } } @@ -71,19 +78,19 @@ export function createAIFunction, Output>( writable: false }) - const strict = !!spec.strict - aiFunction.inputSchema = spec.inputSchema aiFunction.parseInput = parseInput + aiFunction.spec = { name: spec.name, description: spec.description?.trim() ?? '', - parameters: zodToJsonSchema(spec.inputSchema, { strict }), + parameters: inputSchema.jsonSchema, type: 'function', strict } + aiFunction.execute = ( - params: z.infer + params: types.inferInput ): types.MaybePromise => { return implementation(params) } diff --git a/packages/core/src/fns.ts b/packages/core/src/fns.ts index 16cd89f..6c51678 100644 --- a/packages/core/src/fns.ts +++ b/packages/core/src/fns.ts @@ -1,5 +1,3 @@ -import type { z } from 'zod' - import type * as types from './types' import { AIFunctionSet } from './ai-function-set' import { createAIFunction } from './create-ai-function' @@ -8,7 +6,7 @@ import { assert } from './utils' export interface PrivateAIFunctionMetadata { name: string description: string - inputSchema: z.AnyZodObject + inputSchema: types.AIFunctionInputSchema methodName: string strict?: boolean } @@ -35,7 +33,7 @@ if (typeof Symbol === 'function' && Symbol.metadata) { } export abstract class AIFunctionsProvider { - private _functions?: AIFunctionSet + protected _functions?: AIFunctionSet /** * An `AIFunctionSet` containing all of the AI-compatible functions exposed @@ -70,7 +68,7 @@ export abstract class AIFunctionsProvider { export function aiFunction< This extends AIFunctionsProvider, - InputSchema extends z.SomeZodObject, + InputSchema extends types.AIFunctionInputSchema, OptionalArgs extends Array, Return extends types.MaybePromise >({ @@ -87,14 +85,14 @@ export function aiFunction< return ( _targetMethod: ( this: This, - input: z.infer, + input: types.inferInput, ...optionalArgs: OptionalArgs ) => Return, context: ClassMethodDecoratorContext< This, ( this: This, - input: z.infer, + input: types.inferInput, ...optionalArgs: OptionalArgs ) => Return > diff --git a/packages/core/src/schema.test.ts b/packages/core/src/schema.test.ts new file mode 100644 index 0000000..ae31c70 --- /dev/null +++ b/packages/core/src/schema.test.ts @@ -0,0 +1,18 @@ +import { expect, test } from 'vitest' +import { z } from 'zod' + +import { asSchema, createJsonSchema, isZodSchema } from './schema' + +test('isZodSchema', () => { + expect(isZodSchema(z.object({}))).toBe(true) + expect(isZodSchema({})).toBe(false) +}) + +test('asSchema', () => { + expect(asSchema(z.object({})).jsonSchema).toEqual({ + type: 'object', + properties: {}, + additionalProperties: false + }) + expect(asSchema(createJsonSchema({})).jsonSchema).toEqual({}) +}) diff --git a/packages/core/src/schema.ts b/packages/core/src/schema.ts index 53ab248..771626c 100644 --- a/packages/core/src/schema.ts +++ b/packages/core/src/schema.ts @@ -39,6 +39,11 @@ export type Schema = { * Schema type for inference. */ _type: TData + + /** + * Source Zod schema if this object was created from a Zod schema. + */ + _source?: any } export function isSchema(value: unknown): value is Schema { @@ -56,10 +61,8 @@ export function isZodSchema(value: unknown): value is z.ZodType { return ( typeof value === 'object' && value !== null && - '_type' in value && - '_output' in value && - '_input' in value && '_def' in value && + '~standard' in value && 'parse' in value && 'safeParse' in value ) @@ -73,16 +76,25 @@ export function asSchema( } /** - * Create a schema from a JSON Schema. + * Create a Schema from a JSON Schema. + * + * All `AIFunction` input schemas accept either a Zod schema or a custom JSON + * Schema. Use this function to wrap JSON schemas for use with `AIFunction`. + * + * Note that JSON Schemas are not validated by default, so you have to pass + * in an optional `parse` function (using `ajv`, for instance) if you'd like to + * validate them at runtime. */ -export function createSchema( +export function createJsonSchema( jsonSchema: types.JSONSchema, { parse = (value) => value as TData, - safeParse + safeParse, + source }: { parse?: types.ParseFn safeParse?: types.SafeParseFn + source?: any } = {} ): Schema { safeParse ??= (value: unknown) => { @@ -99,7 +111,8 @@ export function createSchema( _type: undefined as TData, jsonSchema, parse, - safeParse + safeParse, + _source: source } } @@ -107,10 +120,11 @@ export function createSchemaFromZodSchema( zodSchema: z.Schema, opts: { strict?: boolean } = {} ): Schema { - return createSchema(zodToJsonSchema(zodSchema, opts), { + return createJsonSchema(zodToJsonSchema(zodSchema, opts), { parse: (value) => { return parseStructuredOutput(value, zodSchema) - } + }, + source: zodSchema }) } diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 19153aa..d1c4b57 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -4,6 +4,7 @@ import type { z } from 'zod' import type { AIFunctionSet } from './ai-function-set' import type { AIFunctionsProvider } from './fns' import type { Msg } from './message' +import type { Schema } from './schema' export type { Msg } from './message' export type { Schema } from './schema' @@ -52,6 +53,20 @@ export interface AIToolSpec { function: AIFunctionSpec } +/** + * A Zod object schema or a custom schema created from a JSON schema via + * `createSchema()`. + */ +export type AIFunctionInputSchema = z.ZodObject | Schema + +// eslint-disable-next-line @typescript-eslint/naming-convention +export type inferInput = + InputSchema extends Schema + ? InputSchema['_type'] + : InputSchema extends z.ZodTypeAny + ? z.infer + : never + /** The implementation of the function, with arg parsing and validation. */ export type AIFunctionImpl = Omit< (input: string | Msg) => MaybePromise, @@ -65,13 +80,18 @@ export type AIFunctionImpl = Omit< * via the `.functions` property * - `AIFunction` - Individual functions */ -export type AIFunctionLike = AIFunctionsProvider | AIFunction | AIFunctionSet +export type AIFunctionLike = + | AIFunctionsProvider + | AIFunction + | AIFunctionSet /** * A function meant to be used with LLM function calling. */ export interface AIFunction< - InputSchema extends z.ZodObject = z.ZodObject, + // TODO + // InputSchema extends AIFunctionInputSchema = z.ZodObject, + InputSchema extends AIFunctionInputSchema = AIFunctionInputSchema, Output = any > { /** @@ -81,11 +101,11 @@ export interface AIFunction< */ (input: string | Msg): MaybePromise - /** The Zod schema for the input object. */ + /** The schema for the input object (zod or custom schema). */ inputSchema: InputSchema /** Parse the function arguments from a message. */ - parseInput(input: string | Msg): z.infer + parseInput(input: string | Msg): inferInput /** The JSON schema function spec for the OpenAI API `functions` property. */ spec: AIFunctionSpec @@ -94,7 +114,7 @@ export interface AIFunction< * The underlying function implementation without any arg parsing or validation. */ // TODO: this `any` shouldn't be necessary, but it is for `createAIFunction` results to be assignable to `AIFunctionLike` - execute: (params: z.infer | any) => MaybePromise + execute: (params: inferInput | any) => MaybePromise } export type SafeParseResult = diff --git a/packages/dexter/src/dexter.ts b/packages/dexter/src/dexter.ts index 06acfbf..5c37594 100644 --- a/packages/dexter/src/dexter.ts +++ b/packages/dexter/src/dexter.ts @@ -1,4 +1,4 @@ -import { type AIFunctionLike, AIFunctionSet } from '@agentic/core' +import { type AIFunctionLike, AIFunctionSet, isZodSchema } from '@agentic/core' import { createAIFunction } from '@dexaai/dexter' /** @@ -10,8 +10,14 @@ export function createDexterFunctions( ) { const fns = new AIFunctionSet(aiFunctionLikeTools) - return fns.map((fn) => - createAIFunction( + return fns.map((fn) => { + if (!isZodSchema(fn.inputSchema)) { + throw new Error( + `Dexter tools only support Zod schemas: ${fn.spec.name} tool uses a custom JSON Schema, which is currently not supported.` + ) + } + + return createAIFunction( { name: fn.spec.name, description: fn.spec.description, @@ -19,5 +25,5 @@ export function createDexterFunctions( }, fn.execute ) - ) + }) } diff --git a/packages/genkit/src/genkit.ts b/packages/genkit/src/genkit.ts index 5aa4c53..04b7f89 100644 --- a/packages/genkit/src/genkit.ts +++ b/packages/genkit/src/genkit.ts @@ -1,5 +1,10 @@ import type { Genkit } from 'genkit' -import { type AIFunctionLike, AIFunctionSet } from '@agentic/core' +import { + type AIFunctionLike, + AIFunctionSet, + asSchema, + isZodSchema +} from '@agentic/core' import { z } from 'zod' /** @@ -12,15 +17,22 @@ export function createGenkitTools( ) { const fns = new AIFunctionSet(aiFunctionLikeTools) - return fns.map((fn) => - genkit.defineTool( + return fns.map((fn) => { + const inputSchemaKey = isZodSchema(fn.inputSchema) + ? ('inputSchema' as const) + : ('inputJsonSchema' as const) + + return genkit.defineTool( { name: fn.spec.name, description: fn.spec.description, - inputSchema: fn.inputSchema, + // TODO: This schema handling should be able to be cleaned up. + [inputSchemaKey]: isZodSchema(fn.inputSchema) + ? fn.inputSchema + : asSchema(fn.inputSchema).jsonSchema, outputSchema: z.any() }, fn.execute ) - ) + }) } diff --git a/packages/mastra/src/mastra.ts b/packages/mastra/src/mastra.ts index 196d757..9de752d 100644 --- a/packages/mastra/src/mastra.ts +++ b/packages/mastra/src/mastra.ts @@ -1,4 +1,4 @@ -import { type AIFunctionLike, AIFunctionSet } from '@agentic/core' +import { type AIFunctionLike, AIFunctionSet, isZodSchema } from '@agentic/core' import { createTool } from '@mastra/core/tools' /** @@ -9,14 +9,22 @@ export function createMastraTools(...aiFunctionLikeTools: AIFunctionLike[]) { const fns = new AIFunctionSet(aiFunctionLikeTools) return Object.fromEntries( - fns.map((fn) => [ - fn.spec.name, - createTool({ - id: fn.spec.name, - description: fn.spec.description, - inputSchema: fn.inputSchema, - execute: (ctx) => fn.execute(ctx.context) - }) - ]) + fns.map((fn) => { + if (!isZodSchema(fn.inputSchema)) { + throw new Error( + `Mastra tools only support Zod schemas: ${fn.spec.name} tool uses a custom JSON Schema, which is currently not supported.` + ) + } + + return [ + fn.spec.name, + createTool({ + id: fn.spec.name, + description: fn.spec.description, + inputSchema: fn.inputSchema, + execute: (ctx) => fn.execute(ctx.context) + }) + ] + }) ) } diff --git a/packages/stdlib/package.json b/packages/stdlib/package.json index 62f54d9..2876d69 100644 --- a/packages/stdlib/package.json +++ b/packages/stdlib/package.json @@ -32,12 +32,14 @@ }, "dependencies": { "@agentic/apollo": "workspace:*", + "@agentic/arxiv": "workspace:*", "@agentic/bing": "workspace:*", "@agentic/calculator": "workspace:*", "@agentic/clearbit": "workspace:*", "@agentic/core": "workspace:*", "@agentic/dexa": "workspace:*", "@agentic/diffbot": "workspace:*", + "@agentic/duck-duck-go": "workspace:*", "@agentic/e2b": "workspace:*", "@agentic/exa": "workspace:*", "@agentic/firecrawl": "workspace:*", @@ -48,6 +50,7 @@ "@agentic/jina": "workspace:*", "@agentic/leadmagic": "workspace:*", "@agentic/midjourney": "workspace:*", + "@agentic/mcp": "workspace:*", "@agentic/novu": "workspace:*", "@agentic/people-data-labs": "workspace:*", "@agentic/perigon": "workspace:*", diff --git a/packages/stdlib/src/index.ts b/packages/stdlib/src/index.ts index c099adb..35f8a3a 100644 --- a/packages/stdlib/src/index.ts +++ b/packages/stdlib/src/index.ts @@ -1,9 +1,11 @@ export * from '@agentic/apollo' +export * from '@agentic/arxiv' export * from '@agentic/bing' export * from '@agentic/calculator' export * from '@agentic/clearbit' export * from '@agentic/dexa' export * from '@agentic/diffbot' +export * from '@agentic/duck-duck-go' export * from '@agentic/e2b' export * from '@agentic/exa' export * from '@agentic/firecrawl' @@ -13,6 +15,7 @@ export * from '@agentic/hacker-news' export * from '@agentic/hunter' export * from '@agentic/jina' export * from '@agentic/leadmagic' +export * from '@agentic/mcp' export * from '@agentic/midjourney' export * from '@agentic/novu' export * from '@agentic/people-data-labs' diff --git a/packages/xsai/src/xsai.ts b/packages/xsai/src/xsai.ts index 5bc9456..13fbbb9 100644 --- a/packages/xsai/src/xsai.ts +++ b/packages/xsai/src/xsai.ts @@ -1,4 +1,4 @@ -import { type AIFunctionLike, AIFunctionSet } from '@agentic/core' +import { type AIFunctionLike, AIFunctionSet, isZodSchema } from '@agentic/core' import { tool, type ToolResult } from '@xsai/tool' /** @@ -11,13 +11,19 @@ export function createXSAITools( const fns = new AIFunctionSet(aiFunctionLikeTools) return Promise.all( - fns.map((fn) => - tool({ + fns.map((fn) => { + if (!isZodSchema(fn.inputSchema)) { + throw new Error( + `xsAI tools only support Standard schemas like Zod: ${fn.spec.name} tool uses a custom JSON Schema, which is currently not supported.` + ) + } + + return tool({ name: fn.spec.name, description: fn.spec.description, parameters: fn.inputSchema, execute: fn.execute }) - ) + }) ) } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a8ca456..ab0b87b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,6 +24,9 @@ catalogs: '@mastra/core': specifier: ^0.6.1 version: 0.6.1 + '@modelcontextprotocol/sdk': + specifier: ^1.7.0 + version: 1.7.0 '@nangohq/node': specifier: ^0.42.2 version: 0.42.22 @@ -42,6 +45,9 @@ catalogs: delay: specifier: ^6.0.0 version: 6.0.0 + fast-xml-parser: + specifier: ^5.0.9 + version: 5.0.9 genkit: specifier: ^1.2.0 version: 1.2.0 @@ -170,6 +176,9 @@ importers: '@agentic/ai-sdk': specifier: workspace:* version: link:../../packages/ai-sdk + '@agentic/mcp': + specifier: workspace:* + version: link:../../packages/mcp '@agentic/weather': specifier: workspace:* version: link:../../packages/weather @@ -179,6 +188,9 @@ importers: ai: specifier: 'catalog:' version: 4.1.61(react@18.3.1)(zod@3.24.2) + exit-hook: + specifier: ^4.0.0 + version: 4.0.0 openai: specifier: 'catalog:' version: 4.87.3(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2) @@ -407,6 +419,25 @@ importers: specifier: workspace:* version: link:../tsconfig + packages/arxiv: + dependencies: + '@agentic/core': + specifier: workspace:* + version: link:../core + fast-xml-parser: + specifier: 'catalog:' + version: 5.0.9 + ky: + specifier: 'catalog:' + version: 1.7.5 + zod: + specifier: 'catalog:' + version: 3.24.2 + devDependencies: + '@agentic/tsconfig': + specifier: workspace:* + version: link:../tsconfig + packages/bing: dependencies: '@agentic/core': @@ -546,6 +577,25 @@ importers: specifier: workspace:* version: link:../tsconfig + packages/duck-duck-go: + dependencies: + '@agentic/core': + specifier: workspace:* + version: link:../core + duck-duck-scrape: + specifier: ^2.2.7 + version: 2.2.7 + string-strip-html: + specifier: ^13.4.12 + version: 13.4.12 + zod: + specifier: 'catalog:' + version: 3.24.2 + devDependencies: + '@agentic/tsconfig': + specifier: workspace:* + version: link:../tsconfig + packages/e2b: dependencies: '@agentic/core': @@ -782,6 +832,22 @@ importers: specifier: 'catalog:' version: 0.6.1(encoding@0.1.13)(react@18.3.1) + packages/mcp: + dependencies: + '@agentic/core': + specifier: workspace:* + version: link:../core + '@modelcontextprotocol/sdk': + specifier: 'catalog:' + version: 1.7.0 + zod: + specifier: 'catalog:' + version: 3.24.2 + devDependencies: + '@agentic/tsconfig': + specifier: workspace:* + version: link:../tsconfig + packages/midjourney: dependencies: '@agentic/core': @@ -814,7 +880,7 @@ importers: specifier: workspace:* version: link:../tsconfig - packages/openapi-to-ts-client: + packages/openapi-to-ts: dependencies: '@agentic/core': specifier: workspace:* @@ -1047,6 +1113,9 @@ importers: '@agentic/apollo': specifier: workspace:* version: link:../apollo + '@agentic/arxiv': + specifier: workspace:* + version: link:../arxiv '@agentic/bing': specifier: workspace:* version: link:../bing @@ -1065,6 +1134,9 @@ importers: '@agentic/diffbot': specifier: workspace:* version: link:../diffbot + '@agentic/duck-duck-go': + specifier: workspace:* + version: link:../duck-duck-go '@agentic/e2b': specifier: workspace:* version: link:../e2b @@ -1092,6 +1164,9 @@ importers: '@agentic/leadmagic': specifier: workspace:* version: link:../leadmagic + '@agentic/mcp': + specifier: workspace:* + version: link:../mcp '@agentic/midjourney': specifier: workspace:* version: link:../midjourney @@ -2097,6 +2172,10 @@ packages: resolution: {integrity: sha512-5J/+Rwi2E809RXlZpgEIBo7i0ruOb8kDCy1Su0eTjqkYvq1hvfJ07YHzAI67bDYmA6G0LZ763KCsUL9rRuxkiw==} engines: {node: '>=20'} + '@modelcontextprotocol/sdk@1.7.0': + resolution: {integrity: sha512-IYPe/FLpvF3IZrd/f5p5ffmWhMc3aEMuM2wGJASDqC2Ge7qatVCdbfPx3n/5xFeb19xN0j/911M2AaFuircsWA==} + engines: {node: '>=18'} + '@nangohq/node@0.42.22': resolution: {integrity: sha512-zFiq6PdtYkaM3oOFLBpKiuu4Gmz2nl8PHSk2JxiRRjx5HBd4oFYf8w7HLY53pRtCHxgLMCJwBDjYF3hjlr8Paw==} engines: {node: '>=18.0'} @@ -3284,6 +3363,9 @@ packages: '@types/jsrsasign@10.5.15': resolution: {integrity: sha512-3stUTaSRtN09PPzVWR6aySD9gNnuymz+WviNHoTb85dKu+BjaV4uBbWWGykBBJkfwPtcNZVfTn2lbX00U+yhpQ==} + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + '@types/lodash@4.17.15': resolution: {integrity: sha512-w/P33JFeySuhN6JLkysYUK2gEmy9kHHFN7E8ro0tkfmlDOgxBDzWEZ/J8cWA+fHqFevpswDTFZnDx+R9lbL6xw==} @@ -3472,6 +3554,10 @@ packages: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + acorn-import-attributes@1.9.5: resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} peerDependencies: @@ -3660,6 +3746,10 @@ packages: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@2.1.0: + resolution: {integrity: sha512-/hPxh61E+ll0Ujp24Ilm64cykicul1ypfwjVttduAiEdtnJFvLePSrIPk+HMImtNv5270wOGCb1Tns2rybMkoQ==} + engines: {node: '>=18'} + bottleneck@2.19.5: resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} @@ -3795,6 +3885,10 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + codsen-utils@1.6.7: + resolution: {integrity: sha512-M+9D3IhFAk4T8iATX62herVuIx1sp5kskWgxEegKD/JwTTSSGjGQs5Q5J4vVJ4mLcn1uhfxDYv6Yzr8zleHF3w==} + engines: {node: '>=14.18.0'} + cohere-ai@7.16.0: resolution: {integrity: sha512-hrG3EtVNSJLxJTaEeGRli+5rX34GiQC/UZ2WuUpaWiRwYbfzz7zKflfU/tg8SFFjkvYHDyS43UvVESepNd8C4w==} @@ -3846,6 +3940,10 @@ packages: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} + content-disposition@1.0.0: + resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} + engines: {node: '>= 0.6'} + content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} @@ -3857,6 +3955,10 @@ packages: cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + cookie@0.7.1: resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} engines: {node: '>= 0.6'} @@ -3922,6 +4024,15 @@ packages: supports-color: optional: true + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -4047,6 +4158,9 @@ packages: dotprompt@1.0.1: resolution: {integrity: sha512-mruM6m+pWe4t41InRDRchNLSl3x+q7iIBukVuUfb7vvN7aEOwP+BuONACAdaEeAqlMDtWHcTsuqqBdAAjGwamg==} + duck-duck-scrape@2.2.7: + resolution: {integrity: sha512-BEcglwnfx5puJl90KQfX+Q2q5vCguqyMpZcSRPBWk8OY55qWwV93+E+7DbIkrGDW4qkqPfUvtOUdi0lXz6lEMQ==} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -4356,6 +4470,10 @@ packages: resolution: {integrity: sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==} engines: {node: '>=18.0.0'} + eventsource@3.0.5: + resolution: {integrity: sha512-LT/5J605bx5SNyE+ITBDiM3FxffBiq9un7Vx0EwMDM3vg8sWKx/tO2zC+LMqZ+smAM0F2hblaDZUVZF0te2pSw==} + engines: {node: '>=18.0.0'} + execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} @@ -4364,14 +4482,28 @@ packages: resolution: {integrity: sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==} engines: {node: ^18.19.0 || >=20.5.0} + exit-hook@4.0.0: + resolution: {integrity: sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==} + engines: {node: '>=18'} + expect-type@1.2.0: resolution: {integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==} engines: {node: '>=12.0.0'} + express-rate-limit@7.5.0: + resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==} + engines: {node: '>= 16'} + peerDependencies: + express: ^4.11 || 5 || ^5.0.0-beta.1 + express@4.21.2: resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} + express@5.0.1: + resolution: {integrity: sha512-ORF7g6qGnD+YtUG9yx4DFoqCShNMmUKiXuT5oWMHiOvt/4WFbHC6yCwQMTSBMno7AqntNCAzzcnnjowRkTL9eQ==} + engines: {node: '>= 18'} + exsolve@1.0.4: resolution: {integrity: sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==} @@ -4415,6 +4547,10 @@ packages: resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} hasBin: true + fast-xml-parser@5.0.9: + resolution: {integrity: sha512-2mBwCiuW3ycKQQ6SOesSB8WeF+fIGb6I/GG5vU5/XEptwFFhp9PE8b9O7fbs2dpq9fXn4ULR3UsfydNUCntf5A==} + hasBin: true + fastembed@1.14.1: resolution: {integrity: sha512-Y14v+FWZwjNUpQ7mRGYu4N5yF+hZkF7zqzPWzzLbwdIEtYsHy0DSpiVJ+Fg6Oi1fQjrBKASQt0hdSMSjw1/Wtw==} @@ -4449,6 +4585,10 @@ packages: resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} + finalhandler@2.1.0: + resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} + engines: {node: '>= 0.8'} + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -4517,6 +4657,10 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -4699,6 +4843,9 @@ packages: hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + html-entities@2.5.2: + resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} + html-to-text@9.0.5: resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} engines: {node: '>=14'} @@ -4729,6 +4876,10 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} + iconv-lite@0.5.2: + resolution: {integrity: sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==} + engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} @@ -4886,6 +5037,9 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -5175,6 +5329,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} @@ -5226,6 +5383,10 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + memorystream@0.3.1: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} @@ -5237,6 +5398,10 @@ packages: merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -5256,10 +5421,18 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mime-types@3.0.0: + resolution: {integrity: sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w==} + engines: {node: '>= 0.6'} + mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} @@ -5314,6 +5487,9 @@ packages: ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -5337,10 +5513,19 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + needle@3.3.1: + resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} + engines: {node: '>= 4.4.x'} + hasBin: true + negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -5610,6 +5795,10 @@ packages: path-to-regexp@0.1.12: resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -5679,6 +5868,10 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} + pkce-challenge@4.1.0: + resolution: {integrity: sha512-ZBmhE1C9LcPoH9XZSdwiPtbPHZROwAnMy+kIFQVrnMCxY4Cudlz3gBOpzilgc0jOgRaiT3sIWfpMomW2ar2orQ==} + engines: {node: '>=16.20.0'} + pkg-types@2.1.0: resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} @@ -5787,6 +5980,10 @@ packages: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -5801,10 +5998,30 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} + ranges-apply@7.0.19: + resolution: {integrity: sha512-imA03KuTSuSpQtq9SDhavUz7BtiddCPj+fsYM/XpdypRN/s8vyTayKzni6m5nYs7VMds1kSNK1V3jfwVrPUWBQ==} + engines: {node: '>=14.18.0'} + + ranges-merge@9.0.18: + resolution: {integrity: sha512-2+6Eh4yxi5sudUmvCdvxVOSdXIXV+Brfutw8chhZmqkT0REqlzilpyQps1S5n8c7f0+idblqSAHGahTbf/Ar5g==} + engines: {node: '>=14.18.0'} + + ranges-push@7.0.18: + resolution: {integrity: sha512-wzGHipEklSlY0QloQ88PNt+PkTURIB42PLLcQGY+WyYBlNpnrzps6EYooD3RqNXtdqMQ9kR8IVaF9itRYtuzLA==} + engines: {node: '>=14.18.0'} + + ranges-sort@6.0.13: + resolution: {integrity: sha512-M3P0/dUnU3ihLPX2jq0MT2NJA1ls/q6cUAUVPD28xdFFqm3VFarPjTKKhnsBSvYCpZD8HdiElAGAyoPu6uOQjA==} + engines: {node: '>=14.18.0'} + raw-body@2.5.2: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} + raw-body@3.0.0: + resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} + engines: {node: '>= 0.8'} + rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} @@ -5928,6 +6145,10 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + router@2.1.0: + resolution: {integrity: sha512-/m/NSLxeYEgWNtyC+WtNHCF7jbGxOibVWKnn+1Psff4dJGOfoXP+MuC/f2CwSmyiHdOIzYnYFp4W6GxWfekaLA==} + engines: {node: '>= 18'} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -5952,6 +6173,9 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} @@ -5983,10 +6207,18 @@ packages: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} + send@1.1.0: + resolution: {integrity: sha512-v67WcEouB5GxbTWL/4NeToqcZiAWEq90N888fczVArY8A79J0L4FD7vj5hm3eUMua5EpoQ59wa/oovY6TLvRUA==} + engines: {node: '>= 18'} + serve-static@1.16.2: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} + serve-static@2.1.0: + resolution: {integrity: sha512-A3We5UfEjG8Z7VkDv6uItWw6HY2bBSBJT1KtVESn6EOoOr2jAxNhxWCLY3jDE2WcuHXByWju74ck3ZgLwL8xmA==} + engines: {node: '>= 18'} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -6115,6 +6347,22 @@ packages: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} + string-collapse-leading-whitespace@7.0.9: + resolution: {integrity: sha512-lEuTHlogBT9PWipfk0FOyvoMKX8syiE03QoFk5MDh8oS0AJ2C07IlstR5cGkxz48nKkOIuvkC28w9Rx/cVRNDg==} + engines: {node: '>=14.18.0'} + + string-left-right@6.0.20: + resolution: {integrity: sha512-dz2mUgmsI7m/FMe+BoxZ2+73X1TUoQvjCdnq8vbIAnHlvWfVZleNUR+lw+QgHA2dlJig+hUWC9bFYdNFGGy2bA==} + engines: {node: '>=14.18.0'} + + string-strip-html@13.4.12: + resolution: {integrity: sha512-mr1GM1TFcwDkYwLE7TNkHY+Lf3YFEBa19W9KntZoJJSbrKF07W4xmLkPnqf8cypEGyr+dc1H9hsdTw5VSNVGxg==} + engines: {node: '>=14.18.0'} + + string-trim-spaces-only@5.0.12: + resolution: {integrity: sha512-Un5nIO1av+hzfnKGmY+bWe0AD4WH37TuDW+jeMPm81rUvU2r3VPRj9vEKdZkPmuhYAMuKlzarm7jDSKwJKOcpQ==} + engines: {node: '>=14.18.0'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -6183,6 +6431,9 @@ packages: strnum@1.1.2: resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} + strnum@2.0.5: + resolution: {integrity: sha512-YAT3K/sgpCUxhxNMrrdhtod3jckkpYwH6JAuwmUdXZsmzH1wUyzTMrrK2wYCEEqlKwrWDd35NeuUkbBy/1iK+Q==} + sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -6267,6 +6518,9 @@ packages: tiny-emitter@2.1.0: resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -6422,6 +6676,10 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} + type-is@2.0.0: + resolution: {integrity: sha512-gd0sGezQYCbWSbkZr75mln4YBidWUN60+devscpLF5mtRDUpiaTvKpBNrdaCvel1NdR2k6vclXybU5fBd2i+nw==} + engines: {node: '>= 0.6'} + typed-array-buffer@1.0.2: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} @@ -7815,6 +8073,20 @@ snapshots: - supports-color - utf-8-validate + '@modelcontextprotocol/sdk@1.7.0': + dependencies: + content-type: 1.0.5 + cors: 2.8.5 + eventsource: 3.0.5 + express: 5.0.1 + express-rate-limit: 7.5.0(express@5.0.1) + pkce-challenge: 4.1.0 + raw-body: 3.0.0 + zod: 3.24.2 + zod-to-json-schema: 3.24.3(zod@3.24.2) + transitivePeerDependencies: + - supports-color + '@nangohq/node@0.42.22': dependencies: axios: 1.7.9 @@ -9322,6 +9594,10 @@ snapshots: '@types/jsrsasign@10.5.15': {} + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.15 + '@types/lodash@4.17.15': {} '@types/memcached@2.2.10': @@ -9576,6 +9852,11 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 + accepts@2.0.0: + dependencies: + mime-types: 3.0.0 + negotiator: 1.0.0 + acorn-import-attributes@1.9.5(acorn@8.14.0): dependencies: acorn: 8.14.0 @@ -9781,6 +10062,20 @@ snapshots: transitivePeerDependencies: - supports-color + body-parser@2.1.0: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.0 + http-errors: 2.0.0 + iconv-lite: 0.5.2 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.0 + type-is: 2.0.0 + transitivePeerDependencies: + - supports-color + bottleneck@2.19.5: {} bowser@2.11.0: {} @@ -9930,6 +10225,10 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + codsen-utils@1.6.7: + dependencies: + rfdc: 1.4.1 + cohere-ai@7.16.0(encoding@0.1.13): dependencies: '@aws-sdk/client-sagemaker': 3.760.0 @@ -9985,6 +10284,10 @@ snapshots: dependencies: safe-buffer: 5.2.1 + content-disposition@1.0.0: + dependencies: + safe-buffer: 5.2.1 + content-type@1.0.5: {} convict@6.2.4: @@ -9994,6 +10297,8 @@ snapshots: cookie-signature@1.0.6: {} + cookie-signature@1.2.2: {} + cookie@0.7.1: {} core-js-compat@3.39.0: @@ -10054,6 +10359,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.3.6: + dependencies: + ms: 2.1.2 + debug@4.4.0: dependencies: ms: 2.1.3 @@ -10156,6 +10465,11 @@ snapshots: handlebars: 4.7.8 yaml: 2.7.0 + duck-duck-scrape@2.2.7: + dependencies: + html-entities: 2.5.2 + needle: 3.3.1 + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -10639,6 +10953,10 @@ snapshots: eventsource-parser@3.0.0: {} + eventsource@3.0.5: + dependencies: + eventsource-parser: 3.0.0 + execa@8.0.1: dependencies: cross-spawn: 7.0.6 @@ -10666,8 +10984,14 @@ snapshots: strip-final-newline: 4.0.0 yoctocolors: 2.1.1 + exit-hook@4.0.0: {} + expect-type@1.2.0: {} + express-rate-limit@7.5.0(express@5.0.1): + dependencies: + express: 5.0.1 + express@4.21.2: dependencies: accepts: 1.3.8 @@ -10704,6 +11028,43 @@ snapshots: transitivePeerDependencies: - supports-color + express@5.0.1: + dependencies: + accepts: 2.0.0 + body-parser: 2.1.0 + content-disposition: 1.0.0 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.2.2 + debug: 4.3.6 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.0 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: 2.0.0 + methods: 1.1.2 + mime-types: 3.0.0 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + router: 2.1.0 + safe-buffer: 5.2.1 + send: 1.1.0 + serve-static: 2.1.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 2.0.0 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + exsolve@1.0.4: {} extend@3.0.2: {} @@ -10744,6 +11105,10 @@ snapshots: dependencies: strnum: 1.1.2 + fast-xml-parser@5.0.9: + dependencies: + strnum: 2.0.5 + fastembed@1.14.1: dependencies: '@anush008/tokenizers': 0.0.0 @@ -10788,6 +11153,17 @@ snapshots: transitivePeerDependencies: - supports-color + finalhandler@2.1.0: + dependencies: + debug: 4.4.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -10847,6 +11223,8 @@ snapshots: fresh@0.5.2: {} + fresh@2.0.0: {} + fs-minipass@2.1.0: dependencies: minipass: 3.3.6 @@ -11073,6 +11451,8 @@ snapshots: hosted-git-info@2.8.9: {} + html-entities@2.5.2: {} + html-to-text@9.0.5: dependencies: '@selderee/plugin-htmlparser2': 0.11.0 @@ -11115,10 +11495,13 @@ snapshots: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.5.2: + dependencies: + safer-buffer: 2.1.2 + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - optional: true ieee754@1.2.1: {} @@ -11250,6 +11633,8 @@ snapshots: is-plain-obj@4.1.0: {} + is-promise@4.0.0: {} + is-regex@1.1.4: dependencies: call-bind: 1.0.7 @@ -11510,6 +11895,8 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash-es@4.17.21: {} + lodash.camelcase@4.3.0: {} lodash.clonedeep@4.5.0: {} @@ -11560,12 +11947,16 @@ snapshots: media-typer@0.3.0: {} + media-typer@1.1.0: {} + memorystream@0.3.1: {} meow@13.2.0: {} merge-descriptors@1.0.3: {} + merge-descriptors@2.0.0: {} + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -11579,10 +11970,16 @@ snapshots: mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 + mime-types@3.0.0: + dependencies: + mime-db: 1.54.0 + mime@1.6.0: {} mimic-fn@4.0.0: {} @@ -11620,6 +12017,8 @@ snapshots: ms@2.0.0: {} + ms@2.1.2: {} + ms@2.1.3: {} mustache@4.2.0: {} @@ -11636,8 +12035,15 @@ snapshots: natural-compare@1.4.0: {} + needle@3.3.1: + dependencies: + iconv-lite: 0.6.3 + sax: 1.4.1 + negotiator@0.6.3: {} + negotiator@1.0.0: {} + neo-async@2.6.2: {} node-addon-api@8.3.1: {} @@ -11909,6 +12315,8 @@ snapshots: path-to-regexp@0.1.12: {} + path-to-regexp@8.2.0: {} + path-type@4.0.0: {} path-type@5.0.0: {} @@ -11981,6 +12389,8 @@ snapshots: pirates@4.0.6: {} + pkce-challenge@4.1.0: {} + pkg-types@2.1.0: dependencies: confbox: 0.2.1 @@ -12077,6 +12487,10 @@ snapshots: dependencies: side-channel: 1.1.0 + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + queue-microtask@1.2.3: {} quick-format-unescaped@4.0.4: {} @@ -12085,6 +12499,25 @@ snapshots: range-parser@1.2.1: {} + ranges-apply@7.0.19: + dependencies: + ranges-merge: 9.0.18 + tiny-invariant: 1.3.3 + + ranges-merge@9.0.18: + dependencies: + ranges-push: 7.0.18 + ranges-sort: 6.0.13 + + ranges-push@7.0.18: + dependencies: + codsen-utils: 1.6.7 + ranges-sort: 6.0.13 + string-collapse-leading-whitespace: 7.0.9 + string-trim-spaces-only: 5.0.12 + + ranges-sort@6.0.13: {} + raw-body@2.5.2: dependencies: bytes: 3.1.2 @@ -12092,6 +12525,13 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + raw-body@3.0.0: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + unpipe: 1.0.0 + rc9@2.1.2: dependencies: defu: 6.1.4 @@ -12261,6 +12701,12 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.36.0 fsevents: 2.3.3 + router@2.1.0: + dependencies: + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.2.0 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -12288,6 +12734,8 @@ snapshots: safer-buffer@2.1.2: {} + sax@1.4.1: {} + secure-json-parse@2.7.0: {} seedrandom@3.0.5: {} @@ -12322,6 +12770,23 @@ snapshots: transitivePeerDependencies: - supports-color + send@1.1.0: + dependencies: + debug: 4.4.0 + destroy: 1.2.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime-types: 2.1.35 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + serve-static@1.16.2: dependencies: encodeurl: 2.0.0 @@ -12331,6 +12796,15 @@ snapshots: transitivePeerDependencies: - supports-color + serve-static@2.1.0: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.1.0 + transitivePeerDependencies: + - supports-color + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -12458,6 +12932,25 @@ snapshots: string-argv@0.3.2: {} + string-collapse-leading-whitespace@7.0.9: {} + + string-left-right@6.0.20: + dependencies: + codsen-utils: 1.6.7 + rfdc: 1.4.1 + + string-strip-html@13.4.12: + dependencies: + '@types/lodash-es': 4.17.12 + codsen-utils: 1.6.7 + html-entities: 2.5.2 + lodash-es: 4.17.21 + ranges-apply: 7.0.19 + ranges-push: 7.0.18 + string-left-right: 6.0.20 + + string-trim-spaces-only@5.0.12: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -12547,6 +13040,8 @@ snapshots: strnum@1.1.2: {} + strnum@2.0.5: {} + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -12630,6 +13125,8 @@ snapshots: tiny-emitter@2.1.0: {} + tiny-invariant@1.3.3: {} + tinybench@2.9.0: {} tinyexec@0.3.2: {} @@ -12770,6 +13267,12 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 + type-is@2.0.0: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.0 + typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 14da1f9..3149e95 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -23,6 +23,8 @@ catalog: type-fest: ^4.37.0 wikibase-sdk: ^10.2.2 '@types/jsrsasign': ^10.5.15 + fast-xml-parser: ^5.0.9 + '@modelcontextprotocol/sdk': ^1.7.0 # vercel ai sdk ai: ^4.1.61 diff --git a/readme.md b/readme.md index 34bfe7c..0b184ad 100644 --- a/readme.md +++ b/readme.md @@ -133,11 +133,13 @@ Full docs are available at [agentic.so](https://agentic.so). | Service / Tool | Package | Docs | Description | | ------------------------------------------------------------------------ | --------------------------- | ------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [Apollo](https://docs.apollo.io) | `@agentic/apollo` | [docs](https://agentic.so/tools/apollo) | B2B person and company enrichment API. | +| [ArXiv](https://arxiv.org) | `@agentic/arxiv` | [docs](https://agentic.so/tools/arxiv) | Search for research articles. | | [Bing](https://www.microsoft.com/en-us/bing/apis/bing-web-search-api) | `@agentic/bing` | [docs](https://agentic.so/tools/bing) | Bing web search. | | [Calculator](https://github.com/josdejong/mathjs) | `@agentic/calculator` | [docs](https://agentic.so/tools/calculator) | Basic calculator for simple mathematical expressions. | | [Clearbit](https://dashboard.clearbit.com/docs) | `@agentic/clearbit` | [docs](https://agentic.so/tools/clearbit) | Resolving and enriching people and company data. | | [Dexa](https://dexa.ai) | `@agentic/dexa` | [docs](https://agentic.so/tools/dexa) | Answers questions from the world's best podcasters. | | [Diffbot](https://docs.diffbot.com) | `@agentic/diffbot` | [docs](https://agentic.so/tools/diffbot) | Web page classification and scraping; person and company data enrichment. | +| [DuckDuckGo](https://duckduckgo.com) | `@agentic/duck-duck-go` | [docs](https://agentic.so/tools/duck-duck-go) | Privacy-focused web search API. | | [E2B](https://e2b.dev) | `@agentic/e2b` | [docs](https://agentic.so/tools/e2b) | Hosted Python code interpreter sandbox which is really useful for data analysis, flexible code execution, and advanced reasoning on-the-fly. | | [Exa](https://docs.exa.ai) | `@agentic/exa` | [docs](https://agentic.so/tools/exa) | Web search tailored for LLMs. | | [Firecrawl](https://www.firecrawl.dev) | `@agentic/firecrawl` | [docs](https://agentic.so/tools/firecrawl) | Website scraping and structured data extraction. | @@ -147,6 +149,7 @@ Full docs are available at [agentic.so](https://agentic.so). | [Jina](https://jina.ai/reader) | `@agentic/jina` | [docs](https://agentic.so/tools/jina) | URL scraper and web search. | | [LeadMagic](https://leadmagic.io) | `@agentic/leadmagic` | [docs](https://agentic.so/tools/leadmagic) | B2B person, company, and email enrichment API. | | [Midjourney](https://www.imagineapi.dev) | `@agentic/midjourney` | [docs](https://agentic.so/tools/midjourney) | Unofficial Midjourney client for generative images. | +| [McpTools](https://modelcontextprotocol.io) | `@agentic/mcp` | [docs](https://agentic.so/tools/mcp) | Model Context Protocol (MCP) adapter, supporting any MCP server. Use [createMcpTools](https://agentic.so/tools/mcp) to spawn or connect to an MCP server. | | [Novu](https://novu.co) | `@agentic/novu` | [docs](https://agentic.so/tools/novu) | Sending notifications (email, SMS, in-app, push, etc). | | [People Data Labs](https://www.peopledatalabs.com) | `@agentic/people-data-labs` | [docs](https://agentic.so/tools/people-data-labs) | People & company data (WIP). | | [Perigon](https://www.goperigon.com/products/news-api) | `@agentic/perigon` | [docs](https://agentic.so/tools/perigon) | Real-time news API and web content data from 140,000+ sources. Structured and enriched by AI, primed for LLMs. |