@mcp-catalog/vinkius 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Vinkius
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,187 @@
1
+ # @mcp-catalog/vinkius
2
+
3
+ **Unlock apps and data for your agents — instantly.** One stdio connection arms your AI agent with 2,000+ hardened, governed MCP servers from [Vinkius AI Gateway](https://vinkius.com) from day one.
4
+
5
+ No more juggling dozens of MCP configs. Your agent connects once, then **searches, activates, and orchestrates** any server from the App Catalog in real time.
6
+
7
+ ---
8
+
9
+ ## Why this exists
10
+
11
+ Every AI agent today faces the same bottleneck: **tool access.** You need GitHub for code, Stripe for payments, Salesforce for CRM, Snowflake for analytics, FRED for economic data — and each one requires a separate MCP server config, separate credentials, separate maintenance.
12
+
13
+ **Vinkius MCP Catalog solves this in one line of config.**
14
+
15
+ Your agent gets a single gateway that can discover, activate, and call any of the 2,000+ production-ready MCP servers in the Vinkius App Catalog — from enterprise SaaS to government datasets to AI platforms.
16
+
17
+ ## What's in the catalog
18
+
19
+ This isn't another list of GitHub and Slack integrations. Vinkius has done the impossible — turning every major API into a governed, production-grade MCP server:
20
+
21
+ | Category | What your agent can access |
22
+ |----------|---------------------------|
23
+ | **Industry Titans** | Salesforce · SAP S/4HANA · Dynamics 365 · Oracle NetSuite · Okta · HubSpot CRM |
24
+ | **Money Moves** | Stripe · PayPal · Plaid · Brex · Mercury · QuickBooks · Shopify · DocuSign |
25
+ | **Ship It** | GitHub · GitLab · Jira · Cloudflare (25 tools!) · CircleCI · Bitbucket · Linear |
26
+ | **AI Frontier** | OpenAI · Anthropic · NVIDIA · Databricks · Cohere · Azure AI · Amazon Bedrock |
27
+ | **The Unthinkable** | FRED (816K+ economic series) · NOAA (36 tools) · Eurostat · U.S. Census · ECB · BLS · EIA |
28
+ | **Fort Knox** | CrowdStrike Falcon · Snyk · CyberArk · Checkmarx · Auth0 · Black Duck |
29
+ | **Growth Engine** | Google Ads · Meta Ads · Facebook Ads · Mailchimp · Amplitude · Ahrefs · ActiveCampaign |
30
+ | **Talk to Me** | Slack · WhatsApp · Twilio · Zoom · Discord · Intercom · Zendesk |
31
+ | **Brain Trust** | Snowflake · BigQuery · Notion · Confluence · Databricks · Elasticsearch |
32
+ | **Superpower** | Midjourney · Wolfram Alpha · ArcGIS · E2B · Home Assistant · Alexa |
33
+ | **Friends of MCP** | Firecrawl · LangSmith · LangGraph · LlamaIndex · Mem0 · Zapier · Make |
34
+
35
+ > **2,000+ servers. Every vertical.** From federal reserve data to smart home control, from enterprise ERP to AI image generation.
36
+
37
+ ## How it works
38
+
39
+ ```
40
+ ┌─────────────┐ stdio ┌──────────────────┐ HTTPS ┌─────────────────────┐
41
+ │ AI Agent │ ◄────────────► │ mcp-catalog │ ◄───────────► │ Vinkius AI Gateway │
42
+ │ (Claude, │ │ (this package) │ │ API │
43
+ │ Cursor) │ └──────────────────┘ └──────────┬──────────┘
44
+ └─────────────┘ │
45
+ ┌────────────────────────────────────────────────────────┘
46
+
47
+ 2,000+ governed MCP servers
48
+ DLP · FinOps · SSRF protection on every call
49
+ ```
50
+
51
+ **Two-tier architecture:**
52
+
53
+ - **Meta-tools** — Always available. Search the catalog, activate servers, manage subscriptions.
54
+ - **Proxy-tools** — Dynamically loaded from your active servers, namespaced as `{slug}__{tool_name}`.
55
+
56
+ All tool execution flows through the Vinkius AI Gateway, which enforces:
57
+ - 🔐 **Authentication** — single `vk_catalog_*` token resolves to per-server credentials transparently
58
+ - 🛡️ **DLP Protection** — PII redaction on every API response
59
+ - 💰 **FinOps Guard** — token budget protection via response truncation
60
+ - 🔒 **SSRF Guard** — DNS-pinned fetches for all upstream calls
61
+
62
+ ## Quick start
63
+
64
+ ### 1. Get your catalog token
65
+
66
+ 1. Sign up at [cloud.vinkius.com](https://cloud.vinkius.com)
67
+ 2. Go to **Settings → Catalog Tokens**
68
+ 3. Click **"Create catalog token"** and copy the `vk_catalog_*` token
69
+
70
+ ### 2. Add one config block
71
+
72
+ #### Claude Desktop (`claude_desktop_config.json`)
73
+
74
+ ```json
75
+ {
76
+ "mcpServers": {
77
+ "vinkius-catalog": {
78
+ "command": "npx",
79
+ "args": ["-y", "@mcp-catalog/vinkius"],
80
+ "env": {
81
+ "VINKIUS_CATALOG_TOKEN": "vk_catalog_YOUR_TOKEN_HERE"
82
+ }
83
+ }
84
+ }
85
+ }
86
+ ```
87
+
88
+ #### Cursor (`.cursor/mcp.json`)
89
+
90
+ ```json
91
+ {
92
+ "mcpServers": {
93
+ "vinkius-catalog": {
94
+ "command": "npx",
95
+ "args": ["-y", "@mcp-catalog/vinkius"],
96
+ "env": {
97
+ "VINKIUS_CATALOG_TOKEN": "vk_catalog_YOUR_TOKEN_HERE"
98
+ }
99
+ }
100
+ }
101
+ }
102
+ ```
103
+
104
+ ### 3. Done. Your agent now has access to 2,000+ MCP servers.
105
+
106
+ ## Built-in tools
107
+
108
+ | Tool | Description |
109
+ |------|-------------|
110
+ | `catalog_search` | Search by intent — "analyze U.S. inflation", "process refunds", "monitor Kubernetes" |
111
+ | `catalog_browse` | Browse all categories and discover what's available |
112
+ | `catalog_activate` | Subscribe to a server (free = instant, paid = checkout link) |
113
+ | `catalog_deactivate` | Unsubscribe from a server |
114
+ | `catalog_tools` | List all currently available tools across active servers |
115
+ | `catalog_analytics` | View usage stats for your active subscriptions |
116
+
117
+ ## Example: cross-category orchestration
118
+
119
+ This is what no other MCP setup can do — seamlessly switching between government data, payments, and communications in a single conversation:
120
+
121
+ ```
122
+ You: I need to analyze U.S. inflation trends and correlate with our Stripe revenue
123
+
124
+ Agent: [uses catalog_search("U.S. inflation economic data")]
125
+ Found "FRED Full Access — U.S. Economic Intelligence" (19 tools)
126
+ and "Bureau of Labor Statistics — The Mega Server" (5 tools)
127
+
128
+ You: Activate FRED and pull CPI data for the last 2 years
129
+
130
+ Agent: [uses catalog_activate("fred-full-access")]
131
+ ✓ FRED activated — 19 tools now available.
132
+ [uses fred-full-access__get_series_observations({ series_id: "CPIAUCSL", ... })]
133
+ CPI data retrieved: 24 monthly observations...
134
+
135
+ You: Now pull our Stripe revenue for the same period
136
+
137
+ Agent: [uses catalog_search("payment processing revenue")]
138
+ Found "Stripe" — already subscribed.
139
+ [uses stripe__list_balance_transactions({ created: { gte: ... } })]
140
+ Revenue data retrieved: $847K across 2,400 transactions...
141
+
142
+ You: Great. Now send a summary to our #finance Slack channel
143
+
144
+ Agent: [uses slack__send_message({ channel: "#finance", text: "..." })]
145
+ ✓ Summary posted to #finance
146
+ ```
147
+
148
+ > **One connection. Three categories. Zero config changes.**
149
+
150
+ ## Environment variables
151
+
152
+ | Variable | Required | Default | Description |
153
+ |----------|----------|---------|-------------|
154
+ | `VINKIUS_CATALOG_TOKEN` | ✅ | — | Your `vk_catalog_*` authentication token |
155
+ | `VINKIUS_API_URL` | ❌ | `https://api.vinkius.com` | API base URL (for self-hosted setups) |
156
+
157
+ ## Security
158
+
159
+ - Your catalog token is **HMAC-SHA256 hashed** — plaintext is never stored on our servers
160
+ - All communication with upstream APIs flows through the Vinkius AI Gateway — your agent never connects directly
161
+ - Each activated server uses its own isolated, scoped credentials
162
+ - Every call passes through DLP, FinOps, and SSRF protection layers
163
+
164
+ ## Requirements
165
+
166
+ - Node.js ≥ 18
167
+ - A [Vinkius](https://vinkius.com) account with a catalog token
168
+
169
+ ## Development
170
+
171
+ ```bash
172
+ npm install
173
+ VINKIUS_CATALOG_TOKEN=vk_catalog_... npm run dev # Run locally
174
+ npm run lint # Type-check
175
+ npm run build # Production build
176
+ ```
177
+
178
+ ## License
179
+
180
+ MIT — see [LICENSE](./LICENSE)
181
+
182
+ ---
183
+
184
+ <p align="center">
185
+ <strong>The governed infrastructure for the AI era.</strong><br/>
186
+ <a href="https://vinkius.com">vinkius.com</a>
187
+ </p>
@@ -0,0 +1,31 @@
1
+ /**
2
+ * HTTP client for the Vinkius AI Gateway Catalog API.
3
+ *
4
+ * All requests are authenticated with the vk_catalog_* Bearer token.
5
+ * The base URL defaults to the production API but can be overridden
6
+ * via the VINKIUS_API_URL environment variable.
7
+ */
8
+ import type { CatalogToolsResponse, CatalogExecuteResponse, CatalogSearchResponse, CatalogActivateResponse, CatalogBrowseResponse, CatalogAnalyticsResponse } from '../types.js';
9
+ export declare class VinkiusClient {
10
+ private readonly baseUrl;
11
+ private readonly token;
12
+ constructor(token: string, baseUrl?: string);
13
+ /** GET /catalog/tools — Aggregated tool manifest. */
14
+ getTools(): Promise<CatalogToolsResponse>;
15
+ /** POST /catalog/execute — Route execution to correct upstream server. */
16
+ execute(toolName: string, args: Record<string, unknown>): Promise<CatalogExecuteResponse>;
17
+ /** GET /catalog/search — Smart search with synonym expansion. */
18
+ search(query: string, limit?: number): Promise<CatalogSearchResponse>;
19
+ /** POST /catalog/activate — Subscribe to a listing. */
20
+ activate(listingId: string): Promise<CatalogActivateResponse>;
21
+ /** POST /catalog/deactivate — Unsubscribe from a listing. */
22
+ deactivate(subscriptionId: string): Promise<{
23
+ deactivated: boolean;
24
+ }>;
25
+ /** GET /catalog/browse — Browse categories. */
26
+ browse(): Promise<CatalogBrowseResponse>;
27
+ /** GET /catalog/analytics — Usage insights. */
28
+ analytics(): Promise<CatalogAnalyticsResponse>;
29
+ private request;
30
+ }
31
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACzB,MAAM,aAAa,CAAC;AAIrB,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAK3C,qDAAqD;IAC/C,QAAQ,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAI/C,0EAA0E;IACpE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAO/F,iEAAiE;IAC3D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAKvE,uDAAuD;IACjD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAMnE,6DAA6D;IACvD,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC;IAM3E,+CAA+C;IACzC,MAAM,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAI9C,+CAA+C;IACzC,SAAS,IAAI,OAAO,CAAC,wBAAwB,CAAC;YAMtC,OAAO;CAyBtB"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * HTTP client for the Vinkius AI Gateway Catalog API.
3
+ *
4
+ * All requests are authenticated with the vk_catalog_* Bearer token.
5
+ * The base URL defaults to the production API but can be overridden
6
+ * via the VINKIUS_API_URL environment variable.
7
+ */
8
+ const DEFAULT_API_URL = 'https://api.vinkius.com';
9
+ export class VinkiusClient {
10
+ baseUrl;
11
+ token;
12
+ constructor(token, baseUrl) {
13
+ this.token = token;
14
+ this.baseUrl = (baseUrl ?? DEFAULT_API_URL).replace(/\/+$/, '');
15
+ }
16
+ /** GET /catalog/tools — Aggregated tool manifest. */
17
+ async getTools() {
18
+ return this.request('GET', '/catalog/tools');
19
+ }
20
+ /** POST /catalog/execute — Route execution to correct upstream server. */
21
+ async execute(toolName, args) {
22
+ return this.request('POST', '/catalog/execute', {
23
+ tool_name: toolName,
24
+ arguments: args,
25
+ });
26
+ }
27
+ /** GET /catalog/search — Smart search with synonym expansion. */
28
+ async search(query, limit = 15) {
29
+ const params = new URLSearchParams({ q: query, limit: String(limit) });
30
+ return this.request('GET', `/catalog/search?${params}`);
31
+ }
32
+ /** POST /catalog/activate — Subscribe to a listing. */
33
+ async activate(listingId) {
34
+ return this.request('POST', '/catalog/activate', {
35
+ listing_id: listingId,
36
+ });
37
+ }
38
+ /** POST /catalog/deactivate — Unsubscribe from a listing. */
39
+ async deactivate(subscriptionId) {
40
+ return this.request('POST', '/catalog/deactivate', {
41
+ subscription_id: subscriptionId,
42
+ });
43
+ }
44
+ /** GET /catalog/browse — Browse categories. */
45
+ async browse() {
46
+ return this.request('GET', '/catalog/browse');
47
+ }
48
+ /** GET /catalog/analytics — Usage insights. */
49
+ async analytics() {
50
+ return this.request('GET', '/catalog/analytics');
51
+ }
52
+ // ── Internal ──────────────────────────────────────────────────────────────
53
+ async request(method, path, body) {
54
+ const url = `${this.baseUrl}${path}`;
55
+ const headers = {
56
+ 'Authorization': `Bearer ${this.token}`,
57
+ 'Accept': 'application/json',
58
+ 'User-Agent': '@mcp-catalog/vinkius',
59
+ };
60
+ const init = { method, headers };
61
+ if (body) {
62
+ headers['Content-Type'] = 'application/json';
63
+ init.body = JSON.stringify(body);
64
+ }
65
+ const response = await fetch(url, init);
66
+ if (!response.ok) {
67
+ const text = await response.text().catch(() => 'Unknown error');
68
+ throw new Error(`Vinkius API ${method} ${path} returned ${response.status}: ${text}`);
69
+ }
70
+ return response.json();
71
+ }
72
+ }
73
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Tool name router for the MCP Catalog.
3
+ *
4
+ * Handles the bidirectional mapping between:
5
+ * - Namespaced MCP tool names: `{listing_slug}__{tool_name}`
6
+ * - Upstream server slugs and their raw tool names
7
+ */
8
+ /** Parse a namespaced tool name into its server slug and real tool name. */
9
+ export declare function parseToolName(namespacedName: string): {
10
+ slug: string;
11
+ toolName: string;
12
+ } | null;
13
+ /** Create a namespaced tool name from a slug and tool name. */
14
+ export declare function namespaceTool(slug: string, toolName: string): string;
15
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/engine/router.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,cAAc,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAW/F;AAED,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEpE"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Tool name router for the MCP Catalog.
3
+ *
4
+ * Handles the bidirectional mapping between:
5
+ * - Namespaced MCP tool names: `{listing_slug}__{tool_name}`
6
+ * - Upstream server slugs and their raw tool names
7
+ */
8
+ /** Parse a namespaced tool name into its server slug and real tool name. */
9
+ export function parseToolName(namespacedName) {
10
+ const separatorIndex = namespacedName.indexOf('__');
11
+ if (separatorIndex === -1) {
12
+ return null;
13
+ }
14
+ return {
15
+ slug: namespacedName.substring(0, separatorIndex),
16
+ toolName: namespacedName.substring(separatorIndex + 2),
17
+ };
18
+ }
19
+ /** Create a namespaced tool name from a slug and tool name. */
20
+ export function namespaceTool(slug, toolName) {
21
+ return `${slug}__${toolName}`;
22
+ }
23
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/engine/router.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAAC,cAAsB;IAClD,MAAM,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpD,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,IAAI,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC,EAAE,cAAc,CAAC;QACjD,QAAQ,EAAE,cAAc,CAAC,SAAS,CAAC,cAAc,GAAG,CAAC,CAAC;KACvD,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,QAAgB;IAC1D,OAAO,GAAG,IAAI,KAAK,QAAQ,EAAE,CAAC;AAChC,CAAC"}
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Vinkius MCP Catalog — Unified gateway to 2,000+ MCP servers.
4
+ *
5
+ * A single stdio MCP server that aggregates all marketplace MCPs
6
+ * behind one connection, with intelligent search and routing.
7
+ *
8
+ * Configuration:
9
+ * VINKIUS_CATALOG_TOKEN — Required. Your vk_catalog_* token.
10
+ * VINKIUS_API_URL — Optional. Defaults to https://api.vinkius.com
11
+ *
12
+ * Usage (claude_desktop_config.json):
13
+ * {
14
+ * "mcpServers": {
15
+ * "vinkius-catalog": {
16
+ * "command": "npx",
17
+ * "args": ["-y", "@mcp-catalog/vinkius"],
18
+ * "env": { "VINKIUS_CATALOG_TOKEN": "vk_catalog_..." }
19
+ * }
20
+ * }
21
+ * }
22
+ */
23
+ export {};
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;GAoBG"}
package/dist/index.js ADDED
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Vinkius MCP Catalog — Unified gateway to 2,000+ MCP servers.
4
+ *
5
+ * A single stdio MCP server that aggregates all marketplace MCPs
6
+ * behind one connection, with intelligent search and routing.
7
+ *
8
+ * Configuration:
9
+ * VINKIUS_CATALOG_TOKEN — Required. Your vk_catalog_* token.
10
+ * VINKIUS_API_URL — Optional. Defaults to https://api.vinkius.com
11
+ *
12
+ * Usage (claude_desktop_config.json):
13
+ * {
14
+ * "mcpServers": {
15
+ * "vinkius-catalog": {
16
+ * "command": "npx",
17
+ * "args": ["-y", "@mcp-catalog/vinkius"],
18
+ * "env": { "VINKIUS_CATALOG_TOKEN": "vk_catalog_..." }
19
+ * }
20
+ * }
21
+ * }
22
+ */
23
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
24
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
25
+ import { VinkiusClient } from './api/client.js';
26
+ import { registerMetaTools } from './tools/meta-tools.js';
27
+ import { refreshProxyTools } from './tools/proxy-tools.js';
28
+ // ── Configuration ───────────────────────────────────────────────────────────
29
+ const CATALOG_TOKEN = process.env.VINKIUS_CATALOG_TOKEN;
30
+ const API_URL = process.env.VINKIUS_API_URL;
31
+ if (!CATALOG_TOKEN) {
32
+ console.error('╔═══════════════════════════════════════════════════════════════════╗\n' +
33
+ '║ VINKIUS_CATALOG_TOKEN is required to use the MCP Catalog. ║\n' +
34
+ '╚═══════════════════════════════════════════════════════════════════╝\n\n' +
35
+ 'Follow these steps to get started:\n\n' +
36
+ ' 1. Sign up or log in at https://cloud.vinkius.com\n' +
37
+ ' 2. Go to Settings → Catalog Tokens\n' +
38
+ ' https://cloud.vinkius.com/settings/catalog-tokens\n' +
39
+ ' 3. Click "Create catalog token" and copy the vk_catalog_* token\n' +
40
+ ' 4. Add it to your MCP client configuration:\n\n' +
41
+ ' claude_desktop_config.json:\n' +
42
+ ' {\n' +
43
+ ' "mcpServers": {\n' +
44
+ ' "vinkius-catalog": {\n' +
45
+ ' "command": "npx",\n' +
46
+ ' "args": ["-y", "@mcp-catalog/vinkius"],\n' +
47
+ ' "env": {\n' +
48
+ ' "VINKIUS_CATALOG_TOKEN": "vk_catalog_YOUR_TOKEN_HERE"\n' +
49
+ ' }\n' +
50
+ ' }\n' +
51
+ ' }\n' +
52
+ ' }\n\n' +
53
+ ' 5. Restart your AI agent\n');
54
+ process.exit(1);
55
+ }
56
+ if (!CATALOG_TOKEN.startsWith('vk_catalog_')) {
57
+ console.error('Error: VINKIUS_CATALOG_TOKEN must start with "vk_catalog_".\n\n' +
58
+ 'You are using: ' + CATALOG_TOKEN.substring(0, 12) + '...\n\n' +
59
+ 'This looks like a regular server token (vk_live_*).\n' +
60
+ 'Catalog tokens are different — they give access to ALL your subscribed MCPs.\n\n' +
61
+ 'Create a catalog token at:\n' +
62
+ ' https://cloud.vinkius.com/settings/catalog-tokens\n');
63
+ process.exit(1);
64
+ }
65
+ // ── Bootstrap ───────────────────────────────────────────────────────────────
66
+ const client = new VinkiusClient(CATALOG_TOKEN, API_URL);
67
+ const registeredProxyTools = new Set();
68
+ const server = new McpServer({
69
+ name: 'vinkius-catalog',
70
+ version: '0.1.0',
71
+ });
72
+ // Register meta-tools (always available)
73
+ registerMetaTools(server, client);
74
+ // Load proxy tools from existing subscriptions (best-effort on startup)
75
+ try {
76
+ await refreshProxyTools(server, client, registeredProxyTools);
77
+ }
78
+ catch {
79
+ // Non-fatal: proxy tools will load when user calls catalog_tools
80
+ console.error('Warning: Could not load proxy tools on startup. Use catalog_tools to refresh.');
81
+ }
82
+ // ── Start stdio transport ───────────────────────────────────────────────────
83
+ const transport = new StdioServerTransport();
84
+ await server.connect(transport);
85
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,+EAA+E;AAE/E,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;AACxD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;AAE5C,IAAI,CAAC,aAAa,EAAE,CAAC;IACnB,OAAO,CAAC,KAAK,CACX,yEAAyE;QACzE,uEAAuE;QACvE,2EAA2E;QAC3E,wCAAwC;QACxC,uDAAuD;QACvD,wCAAwC;QACxC,0DAA0D;QAC1D,qEAAqE;QACrE,mDAAmD;QACnD,oCAAoC;QACpC,UAAU;QACV,0BAA0B;QAC1B,iCAAiC;QACjC,gCAAgC;QAChC,sDAAsD;QACtD,uBAAuB;QACvB,sEAAsE;QACtE,gBAAgB;QAChB,cAAc;QACd,YAAY;QACZ,YAAY;QACZ,8BAA8B,CAC/B,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;IAC7C,OAAO,CAAC,KAAK,CACX,iEAAiE;QACjE,iBAAiB,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS;QAC9D,uDAAuD;QACvD,kFAAkF;QAClF,8BAA8B;QAC9B,uDAAuD,CACxD,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,+EAA+E;AAE/E,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;AACzD,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAC;AAE/C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,iBAAiB;IACvB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,yCAAyC;AACzC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAElC,wEAAwE;AACxE,IAAI,CAAC;IACH,MAAM,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;AAChE,CAAC;AAAC,MAAM,CAAC;IACP,iEAAiE;IACjE,OAAO,CAAC,KAAK,CAAC,+EAA+E,CAAC,CAAC;AACjG,CAAC;AAED,+EAA+E;AAE/E,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Meta-tools — Tier 1 tools that are always available in the catalog.
3
+ *
4
+ * These tools allow the agent to discover, search, activate, and
5
+ * manage MCP servers without needing any pre-configured subscriptions.
6
+ */
7
+ import type { VinkiusClient } from '../api/client.js';
8
+ /** Register all meta-tools on the MCP server instance. */
9
+ export declare function registerMetaTools(server: any, client: VinkiusClient): void;
10
+ //# sourceMappingURL=meta-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-tools.d.ts","sourceRoot":"","sources":["../../src/tools/meta-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAmF1E"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Meta-tools — Tier 1 tools that are always available in the catalog.
3
+ *
4
+ * These tools allow the agent to discover, search, activate, and
5
+ * manage MCP servers without needing any pre-configured subscriptions.
6
+ */
7
+ /** Register all meta-tools on the MCP server instance. */
8
+ export function registerMetaTools(server, client) {
9
+ // ── catalog_search ─────────────────────────────────────────────────────
10
+ server.tool('catalog_search', 'Search the Vinkius MCP marketplace to find servers that match your needs. ' +
11
+ 'Returns relevant MCPs with descriptions, top tools, ratings, and activation instructions. ' +
12
+ 'Use this when you need a capability that is not yet activated.', {
13
+ query: { type: 'string', description: 'What you need (e.g., "track cloud spending", "manage github issues")' },
14
+ limit: { type: 'number', description: 'Max results to return (default: 10)', default: 10 },
15
+ }, async (args) => {
16
+ const result = await client.search(args.query, args.limit ?? 10);
17
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
18
+ });
19
+ // ── catalog_browse ─────────────────────────────────────────────────────
20
+ server.tool('catalog_browse', 'Browse available MCP categories in the Vinkius marketplace. ' +
21
+ 'Returns categories with listing counts. Use this to explore what types of MCPs are available.', {}, async () => {
22
+ const result = await client.browse();
23
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
24
+ });
25
+ // ── catalog_activate ───────────────────────────────────────────────────
26
+ server.tool('catalog_activate', 'Activate (subscribe to) an MCP server from the marketplace. ' +
27
+ 'For free MCPs, activation is instant and tools become available immediately. ' +
28
+ 'For paid MCPs, returns a checkout URL that the user must open in a browser.', {
29
+ listing_id: { type: 'string', description: 'The listing UUID to activate (from catalog_search results)' },
30
+ }, async (args) => {
31
+ const result = await client.activate(args.listing_id);
32
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
33
+ });
34
+ // ── catalog_deactivate ─────────────────────────────────────────────────
35
+ server.tool('catalog_deactivate', 'Deactivate (unsubscribe from) an MCP server. ' +
36
+ 'Revokes access and removes the server tools from the catalog.', {
37
+ subscription_id: { type: 'string', description: 'The subscription UUID to deactivate (from catalog_analytics)' },
38
+ }, async (args) => {
39
+ const result = await client.deactivate(args.subscription_id);
40
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
41
+ });
42
+ // ── catalog_tools ──────────────────────────────────────────────────────
43
+ server.tool('catalog_tools', 'List all currently activated MCP servers and their available tools. ' +
44
+ 'Shows which servers are active and what tools each provides. ' +
45
+ 'Use this to see what capabilities are currently available.', {}, async () => {
46
+ const result = await client.getTools();
47
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
48
+ });
49
+ // ── catalog_analytics ──────────────────────────────────────────────────
50
+ server.tool('catalog_analytics', 'View usage analytics for your activated MCP servers. ' +
51
+ 'Shows request counts, last usage times, and subscription status.', {}, async () => {
52
+ const result = await client.analytics();
53
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
54
+ });
55
+ }
56
+ //# sourceMappingURL=meta-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-tools.js","sourceRoot":"","sources":["../../src/tools/meta-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Proxy-tools — Tier 2 tools dynamically loaded from activated servers.
3
+ *
4
+ * These tools are registered/unregistered as the user activates/deactivates
5
+ * MCP servers via the catalog meta-tools. Each tool is namespaced as
6
+ * `{listing_slug}__{tool_name}` to prevent collisions.
7
+ */
8
+ import type { VinkiusClient } from '../api/client.js';
9
+ /** Refresh all proxy tools on the MCP server based on current subscriptions. */
10
+ export declare function refreshProxyTools(server: any, client: VinkiusClient, registeredTools: Set<string>): Promise<void>;
11
+ //# sourceMappingURL=proxy-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-tools.d.ts","sourceRoot":"","sources":["../../src/tools/proxy-tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGtD,gFAAgF;AAChF,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,aAAa,EACrB,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,GAC3B,OAAO,CAAC,IAAI,CAAC,CAsCf"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Proxy-tools — Tier 2 tools dynamically loaded from activated servers.
3
+ *
4
+ * These tools are registered/unregistered as the user activates/deactivates
5
+ * MCP servers via the catalog meta-tools. Each tool is namespaced as
6
+ * `{listing_slug}__{tool_name}` to prevent collisions.
7
+ */
8
+ /** Refresh all proxy tools on the MCP server based on current subscriptions. */
9
+ export async function refreshProxyTools(server, client, registeredTools) {
10
+ const response = await client.getTools();
11
+ const newToolNames = new Set();
12
+ for (const catalogServer of response.servers) {
13
+ for (const tool of catalogServer.tools) {
14
+ newToolNames.add(tool.name);
15
+ // Skip if already registered
16
+ if (registeredTools.has(tool.name)) {
17
+ continue;
18
+ }
19
+ // Register the proxy tool
20
+ server.tool(tool.name, `[${catalogServer.title}] ${tool.description}`, tool.inputSchema?.properties ?? {}, async (args) => {
21
+ const result = await client.execute(tool.name, args);
22
+ return {
23
+ content: result.content,
24
+ isError: result.isError,
25
+ };
26
+ });
27
+ registeredTools.add(tool.name);
28
+ }
29
+ }
30
+ // Remove tools that are no longer in the active set
31
+ for (const existingTool of registeredTools) {
32
+ if (!newToolNames.has(existingTool)) {
33
+ // MCP SDK doesn't have a direct remove method, but we track state
34
+ registeredTools.delete(existingTool);
35
+ }
36
+ }
37
+ }
38
+ //# sourceMappingURL=proxy-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-tools.js","sourceRoot":"","sources":["../../src/tools/proxy-tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAW,EACX,MAAqB,EACrB,eAA4B;IAE5B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;IACzC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IAEvC,KAAK,MAAM,aAAa,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC7C,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,KAAK,EAAE,CAAC;YACvC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE5B,6BAA6B;YAC7B,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,SAAS;YACX,CAAC;YAED,0BAA0B;YAC1B,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,IAAI,EACT,IAAI,aAAa,CAAC,KAAK,KAAK,IAAI,CAAC,WAAW,EAAE,EAC9C,IAAI,CAAC,WAAW,EAAE,UAAU,IAAI,EAAE,EAClC,KAAK,EAAE,IAA6B,EAAE,EAAE;gBACtC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACrD,OAAO;oBACL,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;iBACxB,CAAC;YACJ,CAAC,CACF,CAAC;YAEF,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,KAAK,MAAM,YAAY,IAAI,eAAe,EAAE,CAAC;QAC3C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YACpC,kEAAkE;YAClE,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Type definitions for the Vinkius MCP Catalog gateway.
3
+ */
4
+ /** A single tool definition as returned by the Vinkius AI Gateway API. */
5
+ export interface CatalogTool {
6
+ name: string;
7
+ description: string;
8
+ inputSchema: Record<string, unknown>;
9
+ }
10
+ /** A server entry in the aggregated tools response. */
11
+ export interface CatalogServer {
12
+ slug: string;
13
+ listing_id: string;
14
+ title: string;
15
+ short_description: string;
16
+ icon_url: string | null;
17
+ tools: CatalogTool[];
18
+ }
19
+ /** Response from GET /catalog/tools */
20
+ export interface CatalogToolsResponse {
21
+ servers: CatalogServer[];
22
+ }
23
+ /** Response from POST /catalog/execute */
24
+ export interface CatalogExecuteResponse {
25
+ content: Array<{
26
+ type: string;
27
+ text: string;
28
+ }>;
29
+ isError: boolean;
30
+ }
31
+ /** A search result listing. */
32
+ export interface CatalogSearchResult {
33
+ id: string;
34
+ slug: string;
35
+ title: string;
36
+ short_description: string;
37
+ listing_type: string;
38
+ publisher_type: string;
39
+ avg_rating: number | null;
40
+ tags: string[];
41
+ categories: string[];
42
+ icon_url: string | null;
43
+ top_tools: Array<{
44
+ name: string;
45
+ description: string;
46
+ }>;
47
+ action: string;
48
+ }
49
+ /** Response from GET /catalog/search */
50
+ export interface CatalogSearchResponse {
51
+ results: CatalogSearchResult[];
52
+ total: number;
53
+ hint: string;
54
+ }
55
+ /** Response from POST /catalog/activate */
56
+ export interface CatalogActivateResponse {
57
+ activated: boolean;
58
+ subscription_id?: string;
59
+ checkout_url?: string;
60
+ message: string;
61
+ }
62
+ /** Response from GET /catalog/browse */
63
+ export interface CatalogBrowseResponse {
64
+ categories: Array<{
65
+ slug: string;
66
+ label: string;
67
+ listing_count: number;
68
+ }>;
69
+ }
70
+ /** Response from GET /catalog/analytics */
71
+ export interface CatalogAnalyticsResponse {
72
+ subscriptions: Array<{
73
+ subscription_id: string;
74
+ title: string;
75
+ slug: string;
76
+ status: string;
77
+ started_at: string;
78
+ request_count: number;
79
+ last_used_at: string | null;
80
+ }>;
81
+ }
82
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,0EAA0E;AAC1E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,uDAAuD;AACvD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED,uCAAuC;AACvC,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,0CAA0C;AAC1C,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,+BAA+B;AAC/B,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wCAAwC;AACxC,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,2CAA2C;AAC3C,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wCAAwC;AACxC,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,KAAK,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC,CAAC;CACJ;AAED,2CAA2C;AAC3C,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,KAAK,CAAC;QACnB,eAAe,EAAE,MAAM,CAAC;QACxB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;KAC7B,CAAC,CAAC;CACJ"}
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Type definitions for the Vinkius MCP Catalog gateway.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@mcp-catalog/vinkius",
3
+ "version": "0.1.0",
4
+ "description": "Unlock apps and data for your AI agents instantly — 2,000+ hardened, governed MCP servers via a single stdio connection",
5
+ "author": "Vinkius",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "keywords": [
9
+ "mcp",
10
+ "model-context-protocol",
11
+ "ai",
12
+ "llm",
13
+ "claude",
14
+ "cursor",
15
+ "agent",
16
+ "tools",
17
+ "marketplace",
18
+ "gateway",
19
+ "stdio",
20
+ "vinkius"
21
+ ],
22
+ "homepage": "https://github.com/VinkiusLabs/mcp-catalog#readme",
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/VinkiusLabs/mcp-catalog.git"
26
+ },
27
+ "bugs": {
28
+ "url": "https://github.com/VinkiusLabs/mcp-catalog/issues"
29
+ },
30
+ "bin": {
31
+ "mcp-catalog": "./dist/index.js"
32
+ },
33
+ "main": "./dist/index.js",
34
+ "files": [
35
+ "dist"
36
+ ],
37
+ "scripts": {
38
+ "build": "tsc",
39
+ "dev": "tsx src/index.ts",
40
+ "start": "node dist/index.js",
41
+ "test": "vitest run",
42
+ "test:watch": "vitest",
43
+ "lint": "tsc --noEmit",
44
+ "prepublishOnly": "npm run build"
45
+ },
46
+ "dependencies": {
47
+ "@modelcontextprotocol/sdk": "^1.12.0"
48
+ },
49
+ "devDependencies": {
50
+ "@types/node": "^22.0.0",
51
+ "tsx": "^4.19.0",
52
+ "typescript": "^5.7.0",
53
+ "vitest": "^4.1.4"
54
+ },
55
+ "engines": {
56
+ "node": ">=18.0.0"
57
+ }
58
+ }