@nordsym/apiclaw 1.1.0 → 1.1.1
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/README.md +2 -6
- package/convex/_generated/api.d.ts +6 -0
- package/convex/analytics.ts +90 -0
- package/convex/http.ts +89 -1
- package/convex/ratelimit.ts +104 -0
- package/convex/schema.ts +40 -0
- package/convex/telemetry.ts +81 -0
- package/dist/discovery.js +9 -9
- package/dist/discovery.js.map +1 -1
- package/dist/index.js +69 -1
- package/dist/index.js.map +1 -1
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +1 -1
- package/dist/proxy.js.map +1 -1
- package/dist/telemetry.d.ts +28 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +50 -0
- package/dist/telemetry.js.map +1 -0
- package/landing/package-lock.json +39 -0
- package/landing/package.json +1 -0
- package/landing/src/app/api/og/route.tsx +14 -4
- package/landing/src/app/layout.tsx +2 -0
- package/landing/src/app/page.tsx +4 -17
- package/package.json +1 -1
- package/src/discovery.ts +9 -9
- package/src/index.ts +71 -1
- package/src/proxy.ts +1 -1
- package/src/telemetry.ts +71 -0
- package/landing/public/og-image.png +0 -0
package/README.md
CHANGED
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
<p align="center">
|
|
2
|
-
<img src="https://apiclaw.nordsym.com/logo.svg" alt="APIClaw" width="80" height="80" />
|
|
3
|
-
</p>
|
|
4
|
-
|
|
5
1
|
<h1 align="center">🦞 APIClaw</h1>
|
|
6
2
|
|
|
7
3
|
<p align="center">
|
|
@@ -21,8 +17,8 @@
|
|
|
21
17
|
</p>
|
|
22
18
|
|
|
23
19
|
<p align="center">
|
|
24
|
-
<img src="https://img.shields.io/badge/APIs-
|
|
25
|
-
<img src="https://img.shields.io/badge/Categories-
|
|
20
|
+
<img src="https://img.shields.io/badge/APIs-10,001-ef4444" alt="APIs" />
|
|
21
|
+
<img src="https://img.shields.io/badge/Categories-446-171717" alt="Categories" />
|
|
26
22
|
<img src="https://img.shields.io/badge/Instant_Connect-6_APIs-00d4ff" alt="Instant Connect" />
|
|
27
23
|
<img src="https://img.shields.io/badge/MCP-Compatible-00d4ff" alt="MCP Compatible" />
|
|
28
24
|
<img src="https://img.shields.io/badge/License-MIT-green" alt="License" />
|
|
@@ -8,10 +8,13 @@
|
|
|
8
8
|
* @module
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
+
import type * as analytics from "../analytics.js";
|
|
11
12
|
import type * as credits from "../credits.js";
|
|
12
13
|
import type * as http from "../http.js";
|
|
13
14
|
import type * as providers from "../providers.js";
|
|
14
15
|
import type * as purchases from "../purchases.js";
|
|
16
|
+
import type * as ratelimit from "../ratelimit.js";
|
|
17
|
+
import type * as telemetry from "../telemetry.js";
|
|
15
18
|
|
|
16
19
|
import type {
|
|
17
20
|
ApiFromModules,
|
|
@@ -20,10 +23,13 @@ import type {
|
|
|
20
23
|
} from "convex/server";
|
|
21
24
|
|
|
22
25
|
declare const fullApi: ApiFromModules<{
|
|
26
|
+
analytics: typeof analytics;
|
|
23
27
|
credits: typeof credits;
|
|
24
28
|
http: typeof http;
|
|
25
29
|
providers: typeof providers;
|
|
26
30
|
purchases: typeof purchases;
|
|
31
|
+
ratelimit: typeof ratelimit;
|
|
32
|
+
telemetry: typeof telemetry;
|
|
27
33
|
}>;
|
|
28
34
|
|
|
29
35
|
/**
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { mutation, query } from "./_generated/server";
|
|
2
|
+
import { v } from "convex/values";
|
|
3
|
+
|
|
4
|
+
// Log an analytics event
|
|
5
|
+
export const log = mutation({
|
|
6
|
+
args: {
|
|
7
|
+
event: v.string(),
|
|
8
|
+
provider: v.optional(v.string()),
|
|
9
|
+
query: v.optional(v.string()),
|
|
10
|
+
identifier: v.string(),
|
|
11
|
+
metadata: v.optional(v.any()),
|
|
12
|
+
},
|
|
13
|
+
handler: async (ctx, args) => {
|
|
14
|
+
return await ctx.db.insert("analytics", {
|
|
15
|
+
...args,
|
|
16
|
+
timestamp: Date.now(),
|
|
17
|
+
});
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
// Get stats for dashboard
|
|
22
|
+
export const getStats = query({
|
|
23
|
+
args: {
|
|
24
|
+
hoursBack: v.optional(v.number()),
|
|
25
|
+
},
|
|
26
|
+
handler: async (ctx, args) => {
|
|
27
|
+
const hoursBack = args.hoursBack || 24;
|
|
28
|
+
const since = Date.now() - hoursBack * 3600000;
|
|
29
|
+
|
|
30
|
+
const events = await ctx.db
|
|
31
|
+
.query("analytics")
|
|
32
|
+
.withIndex("by_timestamp")
|
|
33
|
+
.filter((q) => q.gte(q.field("timestamp"), since))
|
|
34
|
+
.collect();
|
|
35
|
+
|
|
36
|
+
// Aggregate stats
|
|
37
|
+
const stats = {
|
|
38
|
+
totalEvents: events.length,
|
|
39
|
+
discoveries: events.filter((e) => e.event === "discovery").length,
|
|
40
|
+
instantCalls: events.filter((e) => e.event === "instant").length,
|
|
41
|
+
uniqueUsers: new Set(events.map((e) => e.identifier)).size,
|
|
42
|
+
byProvider: {} as Record<string, number>,
|
|
43
|
+
topQueries: [] as { query: string; count: number }[],
|
|
44
|
+
hourly: [] as { hour: string; count: number }[],
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
// By provider
|
|
48
|
+
for (const event of events.filter((e) => e.provider)) {
|
|
49
|
+
stats.byProvider[event.provider!] = (stats.byProvider[event.provider!] || 0) + 1;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Top queries
|
|
53
|
+
const queryCounts: Record<string, number> = {};
|
|
54
|
+
for (const event of events.filter((e) => e.query)) {
|
|
55
|
+
queryCounts[event.query!] = (queryCounts[event.query!] || 0) + 1;
|
|
56
|
+
}
|
|
57
|
+
stats.topQueries = Object.entries(queryCounts)
|
|
58
|
+
.sort(([, a], [, b]) => b - a)
|
|
59
|
+
.slice(0, 10)
|
|
60
|
+
.map(([query, count]) => ({ query, count }));
|
|
61
|
+
|
|
62
|
+
// Hourly breakdown
|
|
63
|
+
const hourlyCounts: Record<string, number> = {};
|
|
64
|
+
for (const event of events) {
|
|
65
|
+
const hour = new Date(event.timestamp).toISOString().slice(0, 13);
|
|
66
|
+
hourlyCounts[hour] = (hourlyCounts[hour] || 0) + 1;
|
|
67
|
+
}
|
|
68
|
+
stats.hourly = Object.entries(hourlyCounts)
|
|
69
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
70
|
+
.map(([hour, count]) => ({ hour, count }));
|
|
71
|
+
|
|
72
|
+
return stats;
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
// Get recent events for live feed
|
|
77
|
+
export const getRecent = query({
|
|
78
|
+
args: {
|
|
79
|
+
limit: v.optional(v.number()),
|
|
80
|
+
},
|
|
81
|
+
handler: async (ctx, args) => {
|
|
82
|
+
const limit = args.limit || 50;
|
|
83
|
+
|
|
84
|
+
return await ctx.db
|
|
85
|
+
.query("analytics")
|
|
86
|
+
.withIndex("by_timestamp")
|
|
87
|
+
.order("desc")
|
|
88
|
+
.take(limit);
|
|
89
|
+
},
|
|
90
|
+
});
|
package/convex/http.ts
CHANGED
|
@@ -442,7 +442,7 @@ http.route({
|
|
|
442
442
|
},
|
|
443
443
|
body: JSON.stringify({
|
|
444
444
|
text,
|
|
445
|
-
model_id: "
|
|
445
|
+
model_id: "eleven_turbo_v2",
|
|
446
446
|
}),
|
|
447
447
|
});
|
|
448
448
|
|
|
@@ -488,3 +488,91 @@ http.route({
|
|
|
488
488
|
method: "OPTIONS",
|
|
489
489
|
handler: httpAction(async () => new Response(null, { headers: corsHeaders })),
|
|
490
490
|
});
|
|
491
|
+
|
|
492
|
+
// 46elks SMS proxy
|
|
493
|
+
http.route({
|
|
494
|
+
path: "/proxy/46elks",
|
|
495
|
+
method: "POST",
|
|
496
|
+
handler: httpAction(async (ctx, request) => {
|
|
497
|
+
const ELKS_USER = process.env.ELKS_API_USER;
|
|
498
|
+
const ELKS_PASS = process.env.ELKS_API_PASSWORD;
|
|
499
|
+
if (!ELKS_USER || !ELKS_PASS) {
|
|
500
|
+
return jsonResponse({ error: "46elks not configured" }, 500);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
try {
|
|
504
|
+
const body = await request.json();
|
|
505
|
+
const { to, message, from = "APIClaw" } = body;
|
|
506
|
+
|
|
507
|
+
const auth = btoa(`${ELKS_USER}:${ELKS_PASS}`);
|
|
508
|
+
|
|
509
|
+
const response = await fetch("https://api.46elks.com/a1/sms", {
|
|
510
|
+
method: "POST",
|
|
511
|
+
headers: {
|
|
512
|
+
"Authorization": `Basic ${auth}`,
|
|
513
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
514
|
+
},
|
|
515
|
+
body: new URLSearchParams({ from, to, message }),
|
|
516
|
+
});
|
|
517
|
+
|
|
518
|
+
const data = await response.json();
|
|
519
|
+
return jsonResponse(data, response.status);
|
|
520
|
+
} catch (e: any) {
|
|
521
|
+
return jsonResponse({ error: e.message }, 500);
|
|
522
|
+
}
|
|
523
|
+
}),
|
|
524
|
+
});
|
|
525
|
+
|
|
526
|
+
// Twilio SMS proxy
|
|
527
|
+
http.route({
|
|
528
|
+
path: "/proxy/twilio",
|
|
529
|
+
method: "POST",
|
|
530
|
+
handler: httpAction(async (ctx, request) => {
|
|
531
|
+
const TWILIO_SID = process.env.TWILIO_ACCOUNT_SID;
|
|
532
|
+
const TWILIO_TOKEN = process.env.TWILIO_AUTH_TOKEN;
|
|
533
|
+
if (!TWILIO_SID || !TWILIO_TOKEN) {
|
|
534
|
+
return jsonResponse({ error: "Twilio not configured" }, 500);
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
try {
|
|
538
|
+
const body = await request.json();
|
|
539
|
+
const { to, message, from } = body;
|
|
540
|
+
|
|
541
|
+
if (!from) {
|
|
542
|
+
return jsonResponse({ error: "Twilio requires 'from' number" }, 400);
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
const auth = btoa(`${TWILIO_SID}:${TWILIO_TOKEN}`);
|
|
546
|
+
|
|
547
|
+
const response = await fetch(
|
|
548
|
+
`https://api.twilio.com/2010-04-01/Accounts/${TWILIO_SID}/Messages.json`,
|
|
549
|
+
{
|
|
550
|
+
method: "POST",
|
|
551
|
+
headers: {
|
|
552
|
+
"Authorization": `Basic ${auth}`,
|
|
553
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
554
|
+
},
|
|
555
|
+
body: new URLSearchParams({ To: to, From: from, Body: message }),
|
|
556
|
+
}
|
|
557
|
+
);
|
|
558
|
+
|
|
559
|
+
const data = await response.json();
|
|
560
|
+
return jsonResponse(data, response.status);
|
|
561
|
+
} catch (e: any) {
|
|
562
|
+
return jsonResponse({ error: e.message }, 500);
|
|
563
|
+
}
|
|
564
|
+
}),
|
|
565
|
+
});
|
|
566
|
+
|
|
567
|
+
// CORS for new endpoints
|
|
568
|
+
http.route({
|
|
569
|
+
path: "/proxy/46elks",
|
|
570
|
+
method: "OPTIONS",
|
|
571
|
+
handler: httpAction(async () => new Response(null, { headers: corsHeaders })),
|
|
572
|
+
});
|
|
573
|
+
|
|
574
|
+
http.route({
|
|
575
|
+
path: "/proxy/twilio",
|
|
576
|
+
method: "OPTIONS",
|
|
577
|
+
handler: httpAction(async () => new Response(null, { headers: corsHeaders })),
|
|
578
|
+
});
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { mutation, query } from "./_generated/server";
|
|
2
|
+
import { v } from "convex/values";
|
|
3
|
+
|
|
4
|
+
// Rate limit config per tier
|
|
5
|
+
const LIMITS = {
|
|
6
|
+
free: {
|
|
7
|
+
discovery: 100, // searches per hour
|
|
8
|
+
instant: 10, // API calls per hour
|
|
9
|
+
},
|
|
10
|
+
subscriber: {
|
|
11
|
+
discovery: 1000,
|
|
12
|
+
instant: 100,
|
|
13
|
+
},
|
|
14
|
+
provider: {
|
|
15
|
+
discovery: 10000,
|
|
16
|
+
instant: 1000,
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// Check and increment rate limit
|
|
21
|
+
export const checkLimit = mutation({
|
|
22
|
+
args: {
|
|
23
|
+
identifier: v.string(), // IP or agentId
|
|
24
|
+
action: v.union(v.literal("discovery"), v.literal("instant")),
|
|
25
|
+
tier: v.optional(v.union(v.literal("free"), v.literal("subscriber"), v.literal("provider"))),
|
|
26
|
+
},
|
|
27
|
+
handler: async (ctx, args) => {
|
|
28
|
+
const tier = args.tier || "free";
|
|
29
|
+
const limit = LIMITS[tier][args.action];
|
|
30
|
+
const hourKey = Math.floor(Date.now() / 3600000); // Hour bucket
|
|
31
|
+
const key = `${args.identifier}:${args.action}:${hourKey}`;
|
|
32
|
+
|
|
33
|
+
// Get current count
|
|
34
|
+
const existing = await ctx.db
|
|
35
|
+
.query("rateLimits")
|
|
36
|
+
.withIndex("by_key", (q) => q.eq("key", key))
|
|
37
|
+
.first();
|
|
38
|
+
|
|
39
|
+
if (existing) {
|
|
40
|
+
if (existing.count >= limit) {
|
|
41
|
+
return { allowed: false, remaining: 0, resetIn: 3600 - (Date.now() % 3600000) / 1000 };
|
|
42
|
+
}
|
|
43
|
+
await ctx.db.patch(existing._id, { count: existing.count + 1 });
|
|
44
|
+
return { allowed: true, remaining: limit - existing.count - 1 };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Create new entry
|
|
48
|
+
await ctx.db.insert("rateLimits", {
|
|
49
|
+
key,
|
|
50
|
+
identifier: args.identifier,
|
|
51
|
+
action: args.action,
|
|
52
|
+
count: 1,
|
|
53
|
+
hourBucket: hourKey,
|
|
54
|
+
createdAt: Date.now(),
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
return { allowed: true, remaining: limit - 1 };
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// Get current usage stats
|
|
62
|
+
export const getUsage = query({
|
|
63
|
+
args: {
|
|
64
|
+
identifier: v.string(),
|
|
65
|
+
},
|
|
66
|
+
handler: async (ctx, args) => {
|
|
67
|
+
const hourKey = Math.floor(Date.now() / 3600000);
|
|
68
|
+
|
|
69
|
+
const discovery = await ctx.db
|
|
70
|
+
.query("rateLimits")
|
|
71
|
+
.withIndex("by_key", (q) => q.eq("key", `${args.identifier}:discovery:${hourKey}`))
|
|
72
|
+
.first();
|
|
73
|
+
|
|
74
|
+
const instant = await ctx.db
|
|
75
|
+
.query("rateLimits")
|
|
76
|
+
.withIndex("by_key", (q) => q.eq("key", `${args.identifier}:instant:${hourKey}`))
|
|
77
|
+
.first();
|
|
78
|
+
|
|
79
|
+
return {
|
|
80
|
+
discovery: discovery?.count || 0,
|
|
81
|
+
instant: instant?.count || 0,
|
|
82
|
+
limits: LIMITS.free,
|
|
83
|
+
};
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
// Cleanup old rate limit entries (run via cron)
|
|
88
|
+
export const cleanup = mutation({
|
|
89
|
+
args: {},
|
|
90
|
+
handler: async (ctx) => {
|
|
91
|
+
const hourAgo = Math.floor(Date.now() / 3600000) - 2; // Keep 2 hours
|
|
92
|
+
|
|
93
|
+
const old = await ctx.db
|
|
94
|
+
.query("rateLimits")
|
|
95
|
+
.filter((q) => q.lt(q.field("hourBucket"), hourAgo))
|
|
96
|
+
.take(100);
|
|
97
|
+
|
|
98
|
+
for (const entry of old) {
|
|
99
|
+
await ctx.db.delete(entry._id);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return { deleted: old.length };
|
|
103
|
+
},
|
|
104
|
+
});
|
package/convex/schema.ts
CHANGED
|
@@ -177,4 +177,44 @@ export default defineSchema({
|
|
|
177
177
|
})
|
|
178
178
|
.index("by_token", ["token"])
|
|
179
179
|
.index("by_providerId", ["providerId"]),
|
|
180
|
+
|
|
181
|
+
// Rate limiting
|
|
182
|
+
rateLimits: defineTable({
|
|
183
|
+
key: v.string(),
|
|
184
|
+
identifier: v.string(),
|
|
185
|
+
action: v.string(),
|
|
186
|
+
count: v.number(),
|
|
187
|
+
hourBucket: v.number(),
|
|
188
|
+
createdAt: v.number(),
|
|
189
|
+
})
|
|
190
|
+
.index("by_key", ["key"])
|
|
191
|
+
.index("by_identifier", ["identifier"]),
|
|
192
|
+
|
|
193
|
+
// Usage analytics
|
|
194
|
+
analytics: defineTable({
|
|
195
|
+
event: v.string(), // "discovery", "instant", "search_query"
|
|
196
|
+
provider: v.optional(v.string()),
|
|
197
|
+
query: v.optional(v.string()),
|
|
198
|
+
identifier: v.string(),
|
|
199
|
+
metadata: v.optional(v.any()),
|
|
200
|
+
timestamp: v.number(),
|
|
201
|
+
})
|
|
202
|
+
.index("by_event", ["event"])
|
|
203
|
+
.index("by_timestamp", ["timestamp"])
|
|
204
|
+
.index("by_provider", ["provider"]),
|
|
205
|
+
|
|
206
|
+
// MCP Server telemetry (anonymous usage tracking)
|
|
207
|
+
telemetry: defineTable({
|
|
208
|
+
type: v.string(), // "startup", "search", "execute", "discovery"
|
|
209
|
+
query: v.optional(v.string()),
|
|
210
|
+
apiId: v.optional(v.string()),
|
|
211
|
+
resultCount: v.optional(v.number()),
|
|
212
|
+
responseTimeMs: v.optional(v.number()),
|
|
213
|
+
version: v.string(),
|
|
214
|
+
platform: v.string(),
|
|
215
|
+
nodeVersion: v.string(),
|
|
216
|
+
timestamp: v.number(),
|
|
217
|
+
})
|
|
218
|
+
.index("by_type", ["type"])
|
|
219
|
+
.index("by_timestamp", ["timestamp"]),
|
|
180
220
|
});
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { mutation, query } from "./_generated/server";
|
|
2
|
+
import { v } from "convex/values";
|
|
3
|
+
|
|
4
|
+
export const track = mutation({
|
|
5
|
+
args: {
|
|
6
|
+
event: v.object({
|
|
7
|
+
type: v.string(),
|
|
8
|
+
query: v.optional(v.string()),
|
|
9
|
+
apiId: v.optional(v.string()),
|
|
10
|
+
resultCount: v.optional(v.number()),
|
|
11
|
+
responseTimeMs: v.optional(v.number()),
|
|
12
|
+
version: v.optional(v.string()),
|
|
13
|
+
platform: v.optional(v.string()),
|
|
14
|
+
nodeVersion: v.optional(v.string()),
|
|
15
|
+
timestamp: v.optional(v.number()),
|
|
16
|
+
}),
|
|
17
|
+
},
|
|
18
|
+
handler: async (ctx, { event }) => {
|
|
19
|
+
await ctx.db.insert("telemetry", {
|
|
20
|
+
type: event.type,
|
|
21
|
+
query: event.query,
|
|
22
|
+
apiId: event.apiId,
|
|
23
|
+
resultCount: event.resultCount,
|
|
24
|
+
responseTimeMs: event.responseTimeMs,
|
|
25
|
+
version: event.version || "unknown",
|
|
26
|
+
platform: event.platform || "unknown",
|
|
27
|
+
nodeVersion: event.nodeVersion || "unknown",
|
|
28
|
+
timestamp: event.timestamp || Date.now(),
|
|
29
|
+
});
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
export const getStats = query({
|
|
34
|
+
args: {},
|
|
35
|
+
handler: async (ctx) => {
|
|
36
|
+
const events = await ctx.db.query("telemetry").collect();
|
|
37
|
+
|
|
38
|
+
const startups = events.filter(e => e.type === "startup").length;
|
|
39
|
+
const searches = events.filter(e => e.type === "search").length;
|
|
40
|
+
const executes = events.filter(e => e.type === "execute").length;
|
|
41
|
+
|
|
42
|
+
const uniqueUsers = new Set(events.map(e => `${e.platform}-${e.nodeVersion}`)).size;
|
|
43
|
+
|
|
44
|
+
const topQueries = events
|
|
45
|
+
.filter(e => e.type === "search" && e.query)
|
|
46
|
+
.reduce((acc, e) => {
|
|
47
|
+
acc[e.query!] = (acc[e.query!] || 0) + 1;
|
|
48
|
+
return acc;
|
|
49
|
+
}, {} as Record<string, number>);
|
|
50
|
+
|
|
51
|
+
const topAPIs = events
|
|
52
|
+
.filter(e => e.type === "execute" && e.apiId)
|
|
53
|
+
.reduce((acc, e) => {
|
|
54
|
+
acc[e.apiId!] = (acc[e.apiId!] || 0) + 1;
|
|
55
|
+
return acc;
|
|
56
|
+
}, {} as Record<string, number>);
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
totalStartups: startups,
|
|
60
|
+
totalSearches: searches,
|
|
61
|
+
totalExecutes: executes,
|
|
62
|
+
estimatedUniqueUsers: uniqueUsers,
|
|
63
|
+
topQueries: Object.entries(topQueries)
|
|
64
|
+
.sort(([,a], [,b]) => b - a)
|
|
65
|
+
.slice(0, 10),
|
|
66
|
+
topAPIs: Object.entries(topAPIs)
|
|
67
|
+
.sort(([,a], [,b]) => b - a)
|
|
68
|
+
.slice(0, 10),
|
|
69
|
+
};
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
export const getRecent = query({
|
|
74
|
+
args: { limit: v.optional(v.number()) },
|
|
75
|
+
handler: async (ctx, { limit = 50 }) => {
|
|
76
|
+
return await ctx.db
|
|
77
|
+
.query("telemetry")
|
|
78
|
+
.order("desc")
|
|
79
|
+
.take(limit);
|
|
80
|
+
},
|
|
81
|
+
});
|
package/dist/discovery.js
CHANGED
|
@@ -21,7 +21,7 @@ export function discoverAPIs(query, options = {}) {
|
|
|
21
21
|
if (category && api.category !== category)
|
|
22
22
|
continue;
|
|
23
23
|
// Region filter
|
|
24
|
-
if (region && !api.regions.includes(region) && !api.regions.includes('global'))
|
|
24
|
+
if (region && api.regions && !api.regions.includes(region) && !api.regions.includes('global'))
|
|
25
25
|
continue;
|
|
26
26
|
// Calculate relevance score
|
|
27
27
|
let score = 0;
|
|
@@ -29,12 +29,12 @@ export function discoverAPIs(query, options = {}) {
|
|
|
29
29
|
// Check keywords
|
|
30
30
|
for (const word of queryWords) {
|
|
31
31
|
// Direct keyword match
|
|
32
|
-
if (api.keywords
|
|
32
|
+
if (api.keywords?.some(k => k.includes(word))) {
|
|
33
33
|
score += 10;
|
|
34
34
|
matchReasons.push(`keyword: ${word}`);
|
|
35
35
|
}
|
|
36
36
|
// Capability match
|
|
37
|
-
if (api.capabilities
|
|
37
|
+
if (api.capabilities?.some(c => c.includes(word))) {
|
|
38
38
|
score += 15;
|
|
39
39
|
matchReasons.push(`capability: ${word}`);
|
|
40
40
|
}
|
|
@@ -49,17 +49,17 @@ export function discoverAPIs(query, options = {}) {
|
|
|
49
49
|
matchReasons.push(`description: ${word}`);
|
|
50
50
|
}
|
|
51
51
|
// Feature match
|
|
52
|
-
if (api.features
|
|
52
|
+
if (api.features?.some(f => f.toLowerCase().includes(word))) {
|
|
53
53
|
score += 8;
|
|
54
54
|
matchReasons.push(`feature: ${word}`);
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
|
-
// Boost for high success rate
|
|
58
|
-
score += api.agent_success_rate * 10;
|
|
59
|
-
// Boost for low latency
|
|
60
|
-
score += Math.max(0, (1000 - api.avg_latency_ms) / 100);
|
|
57
|
+
// Boost for high success rate (default to 0.8 if not set)
|
|
58
|
+
score += (api.agent_success_rate ?? 0.8) * 10;
|
|
59
|
+
// Boost for low latency (default to 500ms if not set)
|
|
60
|
+
score += Math.max(0, (1000 - (api.avg_latency_ms ?? 500)) / 100);
|
|
61
61
|
// Boost for free tier
|
|
62
|
-
if (api.pricing
|
|
62
|
+
if (api.pricing?.free_tier) {
|
|
63
63
|
score += 5;
|
|
64
64
|
matchReasons.push('has free tier');
|
|
65
65
|
}
|
package/dist/discovery.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,8DAA8D;AAG9D,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAChE,CAAC;AACF,MAAM,IAAI,GAAkB,QAAQ,CAAC,IAAI,CAAC;AAE1C;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAa,EACb,UAKI,EAAE;IAEN,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE/D,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAErE,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,kBAAkB;QAClB,IAAI,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;YAAE,SAAS;QAEpD,gBAAgB;QAChB,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,SAAS;
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -13,6 +13,7 @@ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
|
13
13
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
14
14
|
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
15
15
|
import { discoverAPIs, getAPIDetails, getCategories, getAllAPIs } from './discovery.js';
|
|
16
|
+
import { trackStartup, trackSearch } from './telemetry.js';
|
|
16
17
|
import { addCredits, purchaseAPIAccess, getBalanceSummary } from './credits.js';
|
|
17
18
|
import { hasRealCredentials } from './credentials.js';
|
|
18
19
|
import { executeAPICall, getConnectedProviders } from './execute.js';
|
|
@@ -20,6 +21,15 @@ import { executeAPICall, getConnectedProviders } from './execute.js';
|
|
|
20
21
|
const DEFAULT_AGENT_ID = 'agent_default';
|
|
21
22
|
// Tool definitions
|
|
22
23
|
const tools = [
|
|
24
|
+
{
|
|
25
|
+
name: 'apiclaw_help',
|
|
26
|
+
description: 'Get help and see available commands. Start here if you are new to APIClaw.',
|
|
27
|
+
inputSchema: {
|
|
28
|
+
type: 'object',
|
|
29
|
+
properties: {},
|
|
30
|
+
required: []
|
|
31
|
+
}
|
|
32
|
+
},
|
|
23
33
|
{
|
|
24
34
|
name: 'discover_apis',
|
|
25
35
|
description: 'Search for APIs based on what you need to do. Describe your use case naturally.',
|
|
@@ -172,12 +182,49 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
172
182
|
const { name, arguments: args } = request.params;
|
|
173
183
|
try {
|
|
174
184
|
switch (name) {
|
|
185
|
+
case 'apiclaw_help': {
|
|
186
|
+
const helpText = `
|
|
187
|
+
🦞 APIClaw — The API Layer for AI Agents
|
|
188
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
189
|
+
|
|
190
|
+
DISCOVER APIs:
|
|
191
|
+
discover_apis({ query: "send SMS to Sweden" })
|
|
192
|
+
discover_apis({ query: "search the web", max_results: 10 })
|
|
193
|
+
discover_apis({ query: "text to speech", category: "ai" })
|
|
194
|
+
|
|
195
|
+
GET DETAILS:
|
|
196
|
+
get_api_details({ api_id: "46elks" })
|
|
197
|
+
|
|
198
|
+
INSTANT CONNECT (6 APIs, no key needed):
|
|
199
|
+
get_connected_providers()
|
|
200
|
+
call_api({ provider: "brave_search", endpoint: "search", params: { q: "AI agents" } })
|
|
201
|
+
|
|
202
|
+
Available instant-connect providers:
|
|
203
|
+
• brave_search — Web search
|
|
204
|
+
• 46elks — SMS (Sweden)
|
|
205
|
+
• twilio — SMS (Global)
|
|
206
|
+
• resend — Email
|
|
207
|
+
• openrouter — LLM routing
|
|
208
|
+
• elevenlabs — Text-to-speech
|
|
209
|
+
|
|
210
|
+
BROWSE:
|
|
211
|
+
list_categories()
|
|
212
|
+
list_all_apis({ category: "communication", limit: 20 })
|
|
213
|
+
|
|
214
|
+
Docs: https://apiclaw.nordsym.com
|
|
215
|
+
`;
|
|
216
|
+
return {
|
|
217
|
+
content: [{ type: 'text', text: helpText }]
|
|
218
|
+
};
|
|
219
|
+
}
|
|
175
220
|
case 'discover_apis': {
|
|
176
221
|
const query = args?.query;
|
|
177
222
|
const category = args?.category;
|
|
178
223
|
const maxResults = args?.max_results || 5;
|
|
179
224
|
const region = args?.region;
|
|
225
|
+
const startTime = Date.now();
|
|
180
226
|
const results = discoverAPIs(query, { category, maxResults, region });
|
|
227
|
+
trackSearch(query, results.length, Date.now() - startTime);
|
|
181
228
|
if (results.length === 0) {
|
|
182
229
|
return {
|
|
183
230
|
content: [
|
|
@@ -425,7 +472,28 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
425
472
|
async function main() {
|
|
426
473
|
const transport = new StdioServerTransport();
|
|
427
474
|
await server.connect(transport);
|
|
428
|
-
|
|
475
|
+
trackStartup();
|
|
476
|
+
// Welcome message with onboarding
|
|
477
|
+
console.error(`
|
|
478
|
+
🦞 APIClaw v1.1.1 — The API Layer for AI Agents
|
|
479
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
480
|
+
|
|
481
|
+
✓ 10,001 APIs indexed
|
|
482
|
+
✓ 446 categories
|
|
483
|
+
✓ 6 instant-connect providers ready
|
|
484
|
+
|
|
485
|
+
Quick Start:
|
|
486
|
+
discover_apis("send SMS to Sweden")
|
|
487
|
+
discover_apis("search the web")
|
|
488
|
+
discover_apis("generate speech from text")
|
|
489
|
+
|
|
490
|
+
Instant Connect (no API key needed):
|
|
491
|
+
get_connected_providers()
|
|
492
|
+
call_api({ provider: "brave_search", ... })
|
|
493
|
+
|
|
494
|
+
Docs: https://apiclaw.nordsym.com
|
|
495
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
496
|
+
`);
|
|
429
497
|
}
|
|
430
498
|
main().catch(console.error);
|
|
431
499
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/proxy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAe3E;AAED,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAe3E;AAED,eAAO,MAAM,eAAe,UAA6E,CAAC"}
|
package/dist/proxy.js
CHANGED
|
@@ -15,5 +15,5 @@ export async function callProxy(provider, params) {
|
|
|
15
15
|
}
|
|
16
16
|
return response.json();
|
|
17
17
|
}
|
|
18
|
-
export const PROXY_PROVIDERS = ["openrouter", "brave_search", "resend", "elevenlabs"];
|
|
18
|
+
export const PROXY_PROVIDERS = ["openrouter", "brave_search", "resend", "elevenlabs", "46elks", "twilio"];
|
|
19
19
|
//# sourceMappingURL=proxy.js.map
|
package/dist/proxy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,GAAG,kDAAkD,CAAC;AAEtE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,MAAW;IAC3D,MAAM,GAAG,GAAG,GAAG,UAAU,IAAI,QAAQ,EAAE,CAAC;IAExC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;KAC7B,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAuB,CAAC;QAC/G,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,IAAI,gBAAgB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,GAAG,kDAAkD,CAAC;AAEtE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,MAAW;IAC3D,MAAM,GAAG,GAAG,GAAG,UAAU,IAAI,QAAQ,EAAE,CAAC;IAExC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;KAC7B,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAuB,CAAC;QAC/G,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,IAAI,gBAAgB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* APIClaw Telemetry - Anonymous usage tracking
|
|
3
|
+
*
|
|
4
|
+
* Tracks:
|
|
5
|
+
* - Server starts
|
|
6
|
+
* - Search queries (query text only, no PII)
|
|
7
|
+
* - API executions (which APIs are popular)
|
|
8
|
+
*
|
|
9
|
+
* All data is anonymous. No personal information is collected.
|
|
10
|
+
* Disable with APICLAW_TELEMETRY=false
|
|
11
|
+
*/
|
|
12
|
+
interface TelemetryEvent {
|
|
13
|
+
type: 'startup' | 'search' | 'execute' | 'discovery';
|
|
14
|
+
query?: string;
|
|
15
|
+
apiId?: string;
|
|
16
|
+
resultCount?: number;
|
|
17
|
+
responseTimeMs?: number;
|
|
18
|
+
version?: string;
|
|
19
|
+
platform?: string;
|
|
20
|
+
nodeVersion?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare const track: (event: TelemetryEvent) => Promise<void>;
|
|
23
|
+
export declare const trackStartup: () => Promise<void>;
|
|
24
|
+
export declare const trackSearch: (query: string, resultCount: number, responseTimeMs: number) => Promise<void>;
|
|
25
|
+
export declare const trackExecute: (apiId: string, responseTimeMs: number) => Promise<void>;
|
|
26
|
+
export declare const trackDiscovery: (resultCount: number) => Promise<void>;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,UAAU,cAAc;IACtB,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAaD,eAAO,MAAM,KAAK,GAAU,OAAO,cAAc,KAAG,OAAO,CAAC,IAAI,CAuB/D,CAAC;AAEF,eAAO,MAAM,YAAY,qBAAmC,CAAC;AAE7D,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,EAAE,aAAa,MAAM,EAAE,gBAAgB,MAAM,kBACvB,CAAC;AAEhE,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,EAAE,gBAAgB,MAAM,kBACf,CAAC;AAEpD,eAAO,MAAM,cAAc,GAAI,aAAa,MAAM,kBACP,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* APIClaw Telemetry - Anonymous usage tracking
|
|
3
|
+
*
|
|
4
|
+
* Tracks:
|
|
5
|
+
* - Server starts
|
|
6
|
+
* - Search queries (query text only, no PII)
|
|
7
|
+
* - API executions (which APIs are popular)
|
|
8
|
+
*
|
|
9
|
+
* All data is anonymous. No personal information is collected.
|
|
10
|
+
* Disable with APICLAW_TELEMETRY=false
|
|
11
|
+
*/
|
|
12
|
+
const TELEMETRY_ENDPOINT = 'https://agile-crane-840.convex.cloud/api/mutation';
|
|
13
|
+
const isEnabled = () => {
|
|
14
|
+
return process.env.APICLAW_TELEMETRY !== 'false';
|
|
15
|
+
};
|
|
16
|
+
const getContext = () => ({
|
|
17
|
+
version: process.env.npm_package_version || 'unknown',
|
|
18
|
+
platform: process.platform,
|
|
19
|
+
nodeVersion: process.version,
|
|
20
|
+
timestamp: Date.now(),
|
|
21
|
+
});
|
|
22
|
+
export const track = async (event) => {
|
|
23
|
+
if (!isEnabled())
|
|
24
|
+
return;
|
|
25
|
+
try {
|
|
26
|
+
const payload = {
|
|
27
|
+
...event,
|
|
28
|
+
...getContext(),
|
|
29
|
+
};
|
|
30
|
+
// Fire and forget - don't block the main flow
|
|
31
|
+
fetch(TELEMETRY_ENDPOINT, {
|
|
32
|
+
method: 'POST',
|
|
33
|
+
headers: { 'Content-Type': 'application/json' },
|
|
34
|
+
body: JSON.stringify({
|
|
35
|
+
path: 'telemetry:track',
|
|
36
|
+
args: { event: payload },
|
|
37
|
+
}),
|
|
38
|
+
}).catch(() => {
|
|
39
|
+
// Silently fail - telemetry should never break the app
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Silently fail
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
export const trackStartup = () => track({ type: 'startup' });
|
|
47
|
+
export const trackSearch = (query, resultCount, responseTimeMs) => track({ type: 'search', query, resultCount, responseTimeMs });
|
|
48
|
+
export const trackExecute = (apiId, responseTimeMs) => track({ type: 'execute', apiId, responseTimeMs });
|
|
49
|
+
export const trackDiscovery = (resultCount) => track({ type: 'discovery', resultCount });
|
|
50
|
+
//# sourceMappingURL=telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,kBAAkB,GAAG,mDAAmD,CAAC;AAa/E,MAAM,SAAS,GAAG,GAAY,EAAE;IAC9B,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,OAAO,CAAC;AACnD,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,SAAS;IACrD,QAAQ,EAAE,OAAO,CAAC,QAAQ;IAC1B,WAAW,EAAE,OAAO,CAAC,OAAO;IAC5B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;CACtB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,EAAE,KAAqB,EAAiB,EAAE;IAClE,IAAI,CAAC,SAAS,EAAE;QAAE,OAAO;IAEzB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG;YACd,GAAG,KAAK;YACR,GAAG,UAAU,EAAE;SAChB,CAAC;QAEF,8CAA8C;QAC9C,KAAK,CAAC,kBAAkB,EAAE;YACxB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,IAAI,EAAE,iBAAiB;gBACvB,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;aACzB,CAAC;SACH,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACZ,uDAAuD;QACzD,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;IAClB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;AAE7D,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,WAAmB,EAAE,cAAsB,EAAE,EAAE,CACxF,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC;AAEhE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,cAAsB,EAAE,EAAE,CACpE,KAAK,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;AAEpD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,WAAmB,EAAE,EAAE,CACpD,KAAK,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC"}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
"name": "apivault-landing",
|
|
9
9
|
"version": "0.1.0",
|
|
10
10
|
"dependencies": {
|
|
11
|
+
"@vercel/analytics": "^1.6.1",
|
|
11
12
|
"@vercel/og": "^0.8.6",
|
|
12
13
|
"lucide-react": "^0.350.0",
|
|
13
14
|
"next": "^14.2.0",
|
|
@@ -963,6 +964,44 @@
|
|
|
963
964
|
"integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==",
|
|
964
965
|
"license": "MIT"
|
|
965
966
|
},
|
|
967
|
+
"node_modules/@vercel/analytics": {
|
|
968
|
+
"version": "1.6.1",
|
|
969
|
+
"resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.6.1.tgz",
|
|
970
|
+
"integrity": "sha512-oH9He/bEM+6oKlv3chWuOOcp8Y6fo6/PSro8hEkgCW3pu9/OiCXiUpRUogDh3Fs3LH2sosDrx8CxeOLBEE+afg==",
|
|
971
|
+
"license": "MPL-2.0",
|
|
972
|
+
"peerDependencies": {
|
|
973
|
+
"@remix-run/react": "^2",
|
|
974
|
+
"@sveltejs/kit": "^1 || ^2",
|
|
975
|
+
"next": ">= 13",
|
|
976
|
+
"react": "^18 || ^19 || ^19.0.0-rc",
|
|
977
|
+
"svelte": ">= 4",
|
|
978
|
+
"vue": "^3",
|
|
979
|
+
"vue-router": "^4"
|
|
980
|
+
},
|
|
981
|
+
"peerDependenciesMeta": {
|
|
982
|
+
"@remix-run/react": {
|
|
983
|
+
"optional": true
|
|
984
|
+
},
|
|
985
|
+
"@sveltejs/kit": {
|
|
986
|
+
"optional": true
|
|
987
|
+
},
|
|
988
|
+
"next": {
|
|
989
|
+
"optional": true
|
|
990
|
+
},
|
|
991
|
+
"react": {
|
|
992
|
+
"optional": true
|
|
993
|
+
},
|
|
994
|
+
"svelte": {
|
|
995
|
+
"optional": true
|
|
996
|
+
},
|
|
997
|
+
"vue": {
|
|
998
|
+
"optional": true
|
|
999
|
+
},
|
|
1000
|
+
"vue-router": {
|
|
1001
|
+
"optional": true
|
|
1002
|
+
}
|
|
1003
|
+
}
|
|
1004
|
+
},
|
|
966
1005
|
"node_modules/@vercel/og": {
|
|
967
1006
|
"version": "0.8.6",
|
|
968
1007
|
"resolved": "https://registry.npmjs.org/@vercel/og/-/og-0.8.6.tgz",
|
package/landing/package.json
CHANGED
|
@@ -37,17 +37,17 @@ export async function GET() {
|
|
|
37
37
|
maxWidth: 800,
|
|
38
38
|
}}
|
|
39
39
|
>
|
|
40
|
-
|
|
40
|
+
The API Layer for AI Agents
|
|
41
41
|
</div>
|
|
42
42
|
<div
|
|
43
43
|
style={{
|
|
44
44
|
fontSize: 24,
|
|
45
|
-
color: '#
|
|
46
|
-
marginTop:
|
|
45
|
+
color: '#a3a3a3',
|
|
46
|
+
marginTop: 16,
|
|
47
47
|
textAlign: 'center',
|
|
48
48
|
}}
|
|
49
49
|
>
|
|
50
|
-
|
|
50
|
+
Find, evaluate, and integrate APIs in milliseconds.
|
|
51
51
|
</div>
|
|
52
52
|
<div
|
|
53
53
|
style={{
|
|
@@ -64,6 +64,16 @@ export async function GET() {
|
|
|
64
64
|
<span>•</span>
|
|
65
65
|
<span>MCP Native</span>
|
|
66
66
|
</div>
|
|
67
|
+
<div
|
|
68
|
+
style={{
|
|
69
|
+
fontSize: 20,
|
|
70
|
+
color: '#737373',
|
|
71
|
+
marginTop: 24,
|
|
72
|
+
fontStyle: 'italic',
|
|
73
|
+
}}
|
|
74
|
+
>
|
|
75
|
+
Built for the agentic era
|
|
76
|
+
</div>
|
|
67
77
|
</div>
|
|
68
78
|
),
|
|
69
79
|
{
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Metadata } from "next";
|
|
2
|
+
import { Analytics } from "@vercel/analytics/react";
|
|
2
3
|
import "./globals.css";
|
|
3
4
|
import statsData from "@/lib/stats.json";
|
|
4
5
|
|
|
@@ -59,6 +60,7 @@ export default function RootLayout({
|
|
|
59
60
|
</head>
|
|
60
61
|
<body className="antialiased bg-background text-text-primary">
|
|
61
62
|
{children}
|
|
63
|
+
<Analytics />
|
|
62
64
|
</body>
|
|
63
65
|
</html>
|
|
64
66
|
);
|
package/landing/src/app/page.tsx
CHANGED
|
@@ -296,7 +296,7 @@ export default function Home() {
|
|
|
296
296
|
<h1 className="text-5xl md:text-6xl lg:text-7xl font-black mb-6 leading-[1.05] tracking-tighter">
|
|
297
297
|
<span className="gradient-text">The API Layer</span>
|
|
298
298
|
<br />
|
|
299
|
-
<span className="text-text-primary">for
|
|
299
|
+
<span className="text-text-primary">for AI Agents</span>
|
|
300
300
|
</h1>
|
|
301
301
|
|
|
302
302
|
<p className="text-xl md:text-2xl text-text-secondary mb-4 leading-relaxed max-w-xl mx-auto lg:mx-0">
|
|
@@ -331,18 +331,7 @@ export default function Home() {
|
|
|
331
331
|
</a>
|
|
332
332
|
</div>
|
|
333
333
|
|
|
334
|
-
|
|
335
|
-
<div className="pt-8 border-t border-border">
|
|
336
|
-
<p className="text-sm text-text-muted mb-4">Trusted by agents worldwide</p>
|
|
337
|
-
<div className="flex flex-wrap items-center justify-center lg:justify-start gap-3">
|
|
338
|
-
{trustedBy.map((name, i) => (
|
|
339
|
-
<span key={i} className="text-sm text-text-secondary px-3 py-1.5 rounded-lg bg-surface border border-border">
|
|
340
|
-
{name}
|
|
341
|
-
</span>
|
|
342
|
-
))}
|
|
343
|
-
</div>
|
|
344
|
-
</div>
|
|
345
|
-
</div>
|
|
334
|
+
</div>
|
|
346
335
|
|
|
347
336
|
{/* Right: Terminal */}
|
|
348
337
|
<div className="relative">
|
|
@@ -830,10 +819,8 @@ export default function Home() {
|
|
|
830
819
|
<span className="text-xl">🦞</span>
|
|
831
820
|
<span className="font-medium text-sm hidden sm:inline">Chat with the bot</span>
|
|
832
821
|
</div>
|
|
833
|
-
<div className="absolute bottom-full right-0 mb-2 px-3 py-2 bg-surface-elevated border border-border rounded-lg text-xs
|
|
834
|
-
Talk to the
|
|
835
|
-
<br />
|
|
836
|
-
<span className="text-text-primary">Opens in Telegram</span>
|
|
822
|
+
<div className="absolute bottom-full right-0 mb-2 px-3 py-2 bg-surface-elevated border border-border rounded-lg text-xs whitespace-nowrap shadow-lg">
|
|
823
|
+
<span className="text-text-primary font-medium">Talk to the Clawdbot building this</span>
|
|
837
824
|
</div>
|
|
838
825
|
</a>
|
|
839
826
|
</main>
|
package/package.json
CHANGED
package/src/discovery.ts
CHANGED
|
@@ -39,7 +39,7 @@ export function discoverAPIs(
|
|
|
39
39
|
if (category && api.category !== category) continue;
|
|
40
40
|
|
|
41
41
|
// Region filter
|
|
42
|
-
if (region && !api.regions.includes(region) && !api.regions.includes('global')) continue;
|
|
42
|
+
if (region && api.regions && !api.regions.includes(region) && !api.regions.includes('global')) continue;
|
|
43
43
|
|
|
44
44
|
// Calculate relevance score
|
|
45
45
|
let score = 0;
|
|
@@ -48,13 +48,13 @@ export function discoverAPIs(
|
|
|
48
48
|
// Check keywords
|
|
49
49
|
for (const word of queryWords) {
|
|
50
50
|
// Direct keyword match
|
|
51
|
-
if (api.keywords
|
|
51
|
+
if (api.keywords?.some(k => k.includes(word))) {
|
|
52
52
|
score += 10;
|
|
53
53
|
matchReasons.push(`keyword: ${word}`);
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
// Capability match
|
|
57
|
-
if (api.capabilities
|
|
57
|
+
if (api.capabilities?.some(c => c.includes(word))) {
|
|
58
58
|
score += 15;
|
|
59
59
|
matchReasons.push(`capability: ${word}`);
|
|
60
60
|
}
|
|
@@ -72,20 +72,20 @@ export function discoverAPIs(
|
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
// Feature match
|
|
75
|
-
if (api.features
|
|
75
|
+
if (api.features?.some(f => f.toLowerCase().includes(word))) {
|
|
76
76
|
score += 8;
|
|
77
77
|
matchReasons.push(`feature: ${word}`);
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
// Boost for high success rate
|
|
82
|
-
score += api.agent_success_rate * 10;
|
|
81
|
+
// Boost for high success rate (default to 0.8 if not set)
|
|
82
|
+
score += (api.agent_success_rate ?? 0.8) * 10;
|
|
83
83
|
|
|
84
|
-
// Boost for low latency
|
|
85
|
-
score += Math.max(0, (1000 - api.avg_latency_ms) / 100);
|
|
84
|
+
// Boost for low latency (default to 500ms if not set)
|
|
85
|
+
score += Math.max(0, (1000 - (api.avg_latency_ms ?? 500)) / 100);
|
|
86
86
|
|
|
87
87
|
// Boost for free tier
|
|
88
|
-
if (api.pricing
|
|
88
|
+
if (api.pricing?.free_tier) {
|
|
89
89
|
score += 5;
|
|
90
90
|
matchReasons.push('has free tier');
|
|
91
91
|
}
|
package/src/index.ts
CHANGED
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
} from '@modelcontextprotocol/sdk/types.js';
|
|
20
20
|
|
|
21
21
|
import { discoverAPIs, getAPIDetails, getCategories, getAllAPIs } from './discovery.js';
|
|
22
|
+
import { trackStartup, trackSearch, trackExecute, trackDiscovery } from './telemetry.js';
|
|
22
23
|
import {
|
|
23
24
|
getAgentCredits,
|
|
24
25
|
addCredits,
|
|
@@ -35,6 +36,15 @@ const DEFAULT_AGENT_ID = 'agent_default';
|
|
|
35
36
|
|
|
36
37
|
// Tool definitions
|
|
37
38
|
const tools: Tool[] = [
|
|
39
|
+
{
|
|
40
|
+
name: 'apiclaw_help',
|
|
41
|
+
description: 'Get help and see available commands. Start here if you are new to APIClaw.',
|
|
42
|
+
inputSchema: {
|
|
43
|
+
type: 'object',
|
|
44
|
+
properties: {},
|
|
45
|
+
required: []
|
|
46
|
+
}
|
|
47
|
+
},
|
|
38
48
|
{
|
|
39
49
|
name: 'discover_apis',
|
|
40
50
|
description: 'Search for APIs based on what you need to do. Describe your use case naturally.',
|
|
@@ -194,13 +204,51 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
194
204
|
|
|
195
205
|
try {
|
|
196
206
|
switch (name) {
|
|
207
|
+
case 'apiclaw_help': {
|
|
208
|
+
const helpText = `
|
|
209
|
+
🦞 APIClaw — The API Layer for AI Agents
|
|
210
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
211
|
+
|
|
212
|
+
DISCOVER APIs:
|
|
213
|
+
discover_apis({ query: "send SMS to Sweden" })
|
|
214
|
+
discover_apis({ query: "search the web", max_results: 10 })
|
|
215
|
+
discover_apis({ query: "text to speech", category: "ai" })
|
|
216
|
+
|
|
217
|
+
GET DETAILS:
|
|
218
|
+
get_api_details({ api_id: "46elks" })
|
|
219
|
+
|
|
220
|
+
INSTANT CONNECT (6 APIs, no key needed):
|
|
221
|
+
get_connected_providers()
|
|
222
|
+
call_api({ provider: "brave_search", endpoint: "search", params: { q: "AI agents" } })
|
|
223
|
+
|
|
224
|
+
Available instant-connect providers:
|
|
225
|
+
• brave_search — Web search
|
|
226
|
+
• 46elks — SMS (Sweden)
|
|
227
|
+
• twilio — SMS (Global)
|
|
228
|
+
• resend — Email
|
|
229
|
+
• openrouter — LLM routing
|
|
230
|
+
• elevenlabs — Text-to-speech
|
|
231
|
+
|
|
232
|
+
BROWSE:
|
|
233
|
+
list_categories()
|
|
234
|
+
list_all_apis({ category: "communication", limit: 20 })
|
|
235
|
+
|
|
236
|
+
Docs: https://apiclaw.nordsym.com
|
|
237
|
+
`;
|
|
238
|
+
return {
|
|
239
|
+
content: [{ type: 'text', text: helpText }]
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
|
|
197
243
|
case 'discover_apis': {
|
|
198
244
|
const query = args?.query as string;
|
|
199
245
|
const category = args?.category as string | undefined;
|
|
200
246
|
const maxResults = (args?.max_results as number) || 5;
|
|
201
247
|
const region = args?.region as string | undefined;
|
|
202
248
|
|
|
249
|
+
const startTime = Date.now();
|
|
203
250
|
const results = discoverAPIs(query, { category, maxResults, region });
|
|
251
|
+
trackSearch(query, results.length, Date.now() - startTime);
|
|
204
252
|
|
|
205
253
|
if (results.length === 0) {
|
|
206
254
|
return {
|
|
@@ -472,7 +520,29 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
472
520
|
async function main() {
|
|
473
521
|
const transport = new StdioServerTransport();
|
|
474
522
|
await server.connect(transport);
|
|
475
|
-
|
|
523
|
+
trackStartup();
|
|
524
|
+
|
|
525
|
+
// Welcome message with onboarding
|
|
526
|
+
console.error(`
|
|
527
|
+
🦞 APIClaw v1.1.1 — The API Layer for AI Agents
|
|
528
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
529
|
+
|
|
530
|
+
✓ 10,001 APIs indexed
|
|
531
|
+
✓ 446 categories
|
|
532
|
+
✓ 6 instant-connect providers ready
|
|
533
|
+
|
|
534
|
+
Quick Start:
|
|
535
|
+
discover_apis("send SMS to Sweden")
|
|
536
|
+
discover_apis("search the web")
|
|
537
|
+
discover_apis("generate speech from text")
|
|
538
|
+
|
|
539
|
+
Instant Connect (no API key needed):
|
|
540
|
+
get_connected_providers()
|
|
541
|
+
call_api({ provider: "brave_search", ... })
|
|
542
|
+
|
|
543
|
+
Docs: https://apiclaw.nordsym.com
|
|
544
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
545
|
+
`);
|
|
476
546
|
}
|
|
477
547
|
|
|
478
548
|
main().catch(console.error);
|
package/src/proxy.ts
CHANGED
|
@@ -21,4 +21,4 @@ export async function callProxy(provider: string, params: any): Promise<any> {
|
|
|
21
21
|
return response.json();
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
export const PROXY_PROVIDERS = ["openrouter", "brave_search", "resend", "elevenlabs"];
|
|
24
|
+
export const PROXY_PROVIDERS = ["openrouter", "brave_search", "resend", "elevenlabs", "46elks", "twilio"];
|
package/src/telemetry.ts
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* APIClaw Telemetry - Anonymous usage tracking
|
|
3
|
+
*
|
|
4
|
+
* Tracks:
|
|
5
|
+
* - Server starts
|
|
6
|
+
* - Search queries (query text only, no PII)
|
|
7
|
+
* - API executions (which APIs are popular)
|
|
8
|
+
*
|
|
9
|
+
* All data is anonymous. No personal information is collected.
|
|
10
|
+
* Disable with APICLAW_TELEMETRY=false
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const TELEMETRY_ENDPOINT = 'https://agile-crane-840.convex.cloud/api/mutation';
|
|
14
|
+
|
|
15
|
+
interface TelemetryEvent {
|
|
16
|
+
type: 'startup' | 'search' | 'execute' | 'discovery';
|
|
17
|
+
query?: string;
|
|
18
|
+
apiId?: string;
|
|
19
|
+
resultCount?: number;
|
|
20
|
+
responseTimeMs?: number;
|
|
21
|
+
version?: string;
|
|
22
|
+
platform?: string;
|
|
23
|
+
nodeVersion?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const isEnabled = (): boolean => {
|
|
27
|
+
return process.env.APICLAW_TELEMETRY !== 'false';
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const getContext = () => ({
|
|
31
|
+
version: process.env.npm_package_version || 'unknown',
|
|
32
|
+
platform: process.platform,
|
|
33
|
+
nodeVersion: process.version,
|
|
34
|
+
timestamp: Date.now(),
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
export const track = async (event: TelemetryEvent): Promise<void> => {
|
|
38
|
+
if (!isEnabled()) return;
|
|
39
|
+
|
|
40
|
+
try {
|
|
41
|
+
const payload = {
|
|
42
|
+
...event,
|
|
43
|
+
...getContext(),
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
// Fire and forget - don't block the main flow
|
|
47
|
+
fetch(TELEMETRY_ENDPOINT, {
|
|
48
|
+
method: 'POST',
|
|
49
|
+
headers: { 'Content-Type': 'application/json' },
|
|
50
|
+
body: JSON.stringify({
|
|
51
|
+
path: 'telemetry:track',
|
|
52
|
+
args: { event: payload },
|
|
53
|
+
}),
|
|
54
|
+
}).catch(() => {
|
|
55
|
+
// Silently fail - telemetry should never break the app
|
|
56
|
+
});
|
|
57
|
+
} catch {
|
|
58
|
+
// Silently fail
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export const trackStartup = () => track({ type: 'startup' });
|
|
63
|
+
|
|
64
|
+
export const trackSearch = (query: string, resultCount: number, responseTimeMs: number) =>
|
|
65
|
+
track({ type: 'search', query, resultCount, responseTimeMs });
|
|
66
|
+
|
|
67
|
+
export const trackExecute = (apiId: string, responseTimeMs: number) =>
|
|
68
|
+
track({ type: 'execute', apiId, responseTimeMs });
|
|
69
|
+
|
|
70
|
+
export const trackDiscovery = (resultCount: number) =>
|
|
71
|
+
track({ type: 'discovery', resultCount });
|
|
Binary file
|