@bycrawl/mcp 0.2.0 → 0.4.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/README.md CHANGED
@@ -1,5 +1,3 @@
1
- # @bycrawl/mcp
2
-
3
1
  MCP server for [ByCrawl](https://bycrawl.com) — query 8 social media platforms from AI agents like Claude and Cursor.
4
2
 
5
3
  **Supported platforms:** Threads, X/Twitter, Facebook, Reddit, LinkedIn, Xiaohongshu (RED), TikTok, Instagram
@@ -8,12 +6,6 @@ MCP server for [ByCrawl](https://bycrawl.com) — query 8 social media platforms
8
6
 
9
7
  ### Claude Code
10
8
 
11
- ```bash
12
- claude mcp add bycrawl -- npx -y @bycrawl/mcp
13
- ```
14
-
15
- Then set your API key:
16
-
17
9
  ```bash
18
10
  claude mcp add bycrawl -e BYCRAWL_API_KEY=sk_byc_xxx -- npx -y @bycrawl/mcp
19
11
  ```
@@ -0,0 +1,5 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+ export declare const apiContextStorage: AsyncLocalStorage<{
3
+ apiKey: string;
4
+ }>;
5
+ export declare function getApiKey(): string;
@@ -0,0 +1,6 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+ export const apiContextStorage = new AsyncLocalStorage();
3
+ export function getApiKey() {
4
+ return apiContextStorage.getStore()?.apiKey ?? process.env.BYCRAWL_API_KEY ?? "";
5
+ }
6
+ //# sourceMappingURL=api-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-context.js","sourceRoot":"","sources":["../src/api-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAsB,CAAC;AAE7E,MAAM,UAAU,SAAS;IACvB,OAAO,iBAAiB,CAAC,QAAQ,EAAE,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;AACnF,CAAC"}
package/build/client.js CHANGED
@@ -1,5 +1,5 @@
1
+ import { getApiKey } from "./api-context.js";
1
2
  const API_URL = process.env.BYCRAWL_API_URL ?? "https://api.bycrawl.com";
2
- const API_KEY = process.env.BYCRAWL_API_KEY ?? "";
3
3
  export async function bycrawlGet(path, params) {
4
4
  try {
5
5
  const url = new URL(path, API_URL);
@@ -10,7 +10,7 @@ export async function bycrawlGet(path, params) {
10
10
  }
11
11
  }
12
12
  const res = await fetch(url, {
13
- headers: { "x-api-key": API_KEY },
13
+ headers: { "x-api-key": getApiKey() },
14
14
  signal: AbortSignal.timeout(120_000),
15
15
  });
16
16
  const body = await res.text();
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,yBAAyB,CAAC;AACzE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;AAIlD,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAY,EACZ,MAAqE;IAErE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACnC,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;oBAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,OAAO,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE;YACjC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;SACrC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACrD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnF,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,yBAAyB,CAAC;AAIzE,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAY,EACZ,MAAqE;IAErE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACnC,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;oBAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,OAAO,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE;YACrC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;SACrC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACrD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnF,CAAC;AACH,CAAC"}
package/build/index.js CHANGED
@@ -1,31 +1,12 @@
1
1
  #!/usr/bin/env node
2
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
- import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
- import { registerThreadsTools } from "./tools/threads.js";
5
- import { registerXTools } from "./tools/x.js";
6
- import { registerFacebookTools } from "./tools/facebook.js";
7
- import { registerRedditTools } from "./tools/reddit.js";
8
- import { registerLinkedinTools } from "./tools/linkedin.js";
9
- import { registerXiaohongshuTools } from "./tools/xiaohongshu.js";
10
- import { registerTiktokTools } from "./tools/tiktok.js";
11
- import { registerInstagramTools } from "./tools/instagram.js";
12
- import { registerSystemTools } from "./tools/system.js";
13
- import { registerJob104Tools } from "./tools/job104.js";
14
- const server = new McpServer({
15
- name: "bycrawl",
16
- version: "0.1.0",
17
- });
18
- registerThreadsTools(server);
19
- registerXTools(server);
20
- registerFacebookTools(server);
21
- registerRedditTools(server);
22
- registerLinkedinTools(server);
23
- registerXiaohongshuTools(server);
24
- registerTiktokTools(server);
25
- registerInstagramTools(server);
26
- registerJob104Tools(server);
27
- registerSystemTools(server);
28
- const transport = new StdioServerTransport();
29
- await server.connect(transport);
30
- console.error("ByCrawl MCP server running on stdio");
2
+ const useHttp = process.env.TRANSPORT === "http" || process.argv.includes("--http");
3
+ if (useHttp) {
4
+ const { startHttp } = await import("./transport-http.js");
5
+ await startHttp();
6
+ }
7
+ else {
8
+ const { startStdio } = await import("./transport-stdio.js");
9
+ await startStdio();
10
+ }
11
+ export {};
31
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC7B,cAAc,CAAC,MAAM,CAAC,CAAC;AACvB,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC5B,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,wBAAwB,CAAC,MAAM,CAAC,CAAC;AACjC,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC5B,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC/B,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC5B,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAE5B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAChC,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAEpF,IAAI,OAAO,EAAE,CAAC;IACZ,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAC1D,MAAM,SAAS,EAAE,CAAC;AACpB,CAAC;KAAM,CAAC;IACN,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAC5D,MAAM,UAAU,EAAE,CAAC;AACrB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function createServer(): McpServer;
@@ -0,0 +1,33 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { registerThreadsTools } from "./tools/threads.js";
3
+ import { registerXTools } from "./tools/x.js";
4
+ import { registerFacebookTools } from "./tools/facebook.js";
5
+ import { registerRedditTools } from "./tools/reddit.js";
6
+ import { registerLinkedinTools } from "./tools/linkedin.js";
7
+ import { registerXiaohongshuTools } from "./tools/xiaohongshu.js";
8
+ import { registerTiktokTools } from "./tools/tiktok.js";
9
+ import { registerInstagramTools } from "./tools/instagram.js";
10
+ import { registerYoutubeTools } from "./tools/youtube.js";
11
+ import { registerDcardTools } from "./tools/dcard.js";
12
+ import { registerSystemTools } from "./tools/system.js";
13
+ import { registerJob104Tools } from "./tools/job104.js";
14
+ export function createServer() {
15
+ const server = new McpServer({
16
+ name: "bycrawl",
17
+ version: "0.1.0",
18
+ });
19
+ registerThreadsTools(server);
20
+ registerXTools(server);
21
+ registerFacebookTools(server);
22
+ registerRedditTools(server);
23
+ registerLinkedinTools(server);
24
+ registerXiaohongshuTools(server);
25
+ registerTiktokTools(server);
26
+ registerInstagramTools(server);
27
+ registerYoutubeTools(server);
28
+ registerDcardTools(server);
29
+ registerJob104Tools(server);
30
+ registerSystemTools(server);
31
+ return server;
32
+ }
33
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,cAAc,CAAC,MAAM,CAAC,CAAC;IACvB,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAE5B,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerDcardTools(server: McpServer): void;
@@ -0,0 +1,25 @@
1
+ import { z } from "zod";
2
+ import { bycrawlGet } from "../client.js";
3
+ export function registerDcardTools(server) {
4
+ server.tool("dcard_get_post", "Get a Dcard post by ID", { postId: z.string().describe("Dcard post ID") }, async ({ postId }) => bycrawlGet(`/dcard/posts/${postId}`));
5
+ server.tool("dcard_get_post_comments", "Get comments for a Dcard post", {
6
+ postId: z.string().describe("Dcard post ID"),
7
+ sort: z
8
+ .enum(["oldest", "newest", "popular"])
9
+ .optional()
10
+ .describe("Sort order"),
11
+ }, async ({ postId, sort }) => bycrawlGet(`/dcard/posts/${postId}/comments`, { sort }));
12
+ server.tool("dcard_get_forum", "Get Dcard forum info by alias", { alias: z.string().describe("Forum alias (e.g. trending, talk, mood)") }, async ({ alias }) => bycrawlGet(`/dcard/forums/${alias}`));
13
+ server.tool("dcard_get_forum_posts", "Get posts from a Dcard forum", {
14
+ alias: z.string().describe("Forum alias (e.g. trending, talk, mood)"),
15
+ limit: z.number().optional().describe("Number of posts (1-30)"),
16
+ popular: z.boolean().optional().describe("Show popular posts only"),
17
+ }, async ({ alias, limit, popular }) => bycrawlGet(`/dcard/forums/${alias}/posts`, { limit, popular }));
18
+ server.tool("dcard_search_posts", "Search Dcard posts by keyword", {
19
+ q: z.string().describe("Search query"),
20
+ limit: z.number().optional().describe("Number of results (1-100)"),
21
+ offset: z.number().optional().describe("Offset for pagination"),
22
+ }, async ({ q, limit, offset }) => bycrawlGet("/dcard/search/posts", { q, limit, offset }));
23
+ server.tool("dcard_get_persona", "Get a Dcard persona by UID", { uid: z.string().describe("Dcard persona UID") }, async ({ uid }) => bycrawlGet(`/dcard/personas/${uid}`));
24
+ }
25
+ //# sourceMappingURL=dcard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dcard.js","sourceRoot":"","sources":["../../src/tools/dcard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,wBAAwB,EACxB,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,EAChD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAC3D,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,yBAAyB,EACzB,+BAA+B,EAC/B;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC5C,IAAI,EAAE,CAAC;aACJ,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;aACrC,QAAQ,EAAE;aACV,QAAQ,CAAC,YAAY,CAAC;KAC1B,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CACzB,UAAU,CAAC,gBAAgB,MAAM,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,CAC1D,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,+BAA+B,EAC/B,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC,EAAE,EACzE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,iBAAiB,KAAK,EAAE,CAAC,CAC1D,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,8BAA8B,EAC9B;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;QACrE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QAC/D,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;KACpE,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAClC,UAAU,CAAC,iBAAiB,KAAK,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CACjE,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,+BAA+B,EAC/B;QACE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QACtC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QAClE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;KAChE,EACD,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAC7B,UAAU,CAAC,qBAAqB,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAC1D,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,4BAA4B,EAC5B,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,EACjD,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,mBAAmB,GAAG,EAAE,CAAC,CACxD,CAAC;AACJ,CAAC"}
@@ -3,5 +3,18 @@ import { bycrawlGet } from "../client.js";
3
3
  export function registerInstagramTools(server) {
4
4
  server.tool("instagram_search_tags", "Search Instagram hashtags by keyword", { query: z.string().describe("Hashtag to search") }, async ({ query }) => bycrawlGet("/instagram/tags/search", { q: query }));
5
5
  server.tool("instagram_get_user", "Get Instagram user profile with recent posts", { username: z.string().describe("Instagram username") }, async ({ username }) => bycrawlGet(`/instagram/users/${username}`));
6
+ server.tool("instagram_get_post", "Get Instagram post by shortcode", { shortcode: z.string().describe("Post shortcode (from URL, e.g. CxBcDeFgHiJ)") }, async ({ shortcode }) => bycrawlGet(`/instagram/posts/${shortcode}`));
7
+ server.tool("instagram_get_post_comments", "Get comments on an Instagram post with pagination", {
8
+ shortcode: z.string().describe("Post shortcode"),
9
+ cursor: z.string().optional().describe("Pagination cursor from previous response"),
10
+ }, async ({ shortcode, cursor }) => bycrawlGet(`/instagram/posts/${shortcode}/comments`, {
11
+ ...(cursor ? { cursor } : {}),
12
+ }));
13
+ server.tool("instagram_get_user_posts", "Get an Instagram user's posts with pagination", {
14
+ username: z.string().describe("Instagram username"),
15
+ cursor: z.string().optional().describe("Pagination cursor from previous response"),
16
+ }, async ({ username, cursor }) => bycrawlGet(`/instagram/users/${username}/posts`, {
17
+ ...(cursor ? { cursor } : {}),
18
+ }));
6
19
  }
7
20
  //# sourceMappingURL=instagram.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"instagram.js","sourceRoot":"","sources":["../../src/tools/instagram.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,sCAAsC,EACtC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,EACnD,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,wBAAwB,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CACxE,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,8CAA8C,EAC9C,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,EACvD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,oBAAoB,QAAQ,EAAE,CAAC,CACnE,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"instagram.js","sourceRoot":"","sources":["../../src/tools/instagram.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,sCAAsC,EACtC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,EACnD,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,wBAAwB,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CACxE,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,8CAA8C,EAC9C,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,EACvD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,oBAAoB,QAAQ,EAAE,CAAC,CACnE,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,iCAAiC,EACjC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC,EAAE,EACjF,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,oBAAoB,SAAS,EAAE,CAAC,CACrE,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,6BAA6B,EAC7B,mDAAmD,EACnD;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAChD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;KACnF,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAC9B,UAAU,CAAC,oBAAoB,SAAS,WAAW,EAAE;QACnD,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9B,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,0BAA0B,EAC1B,+CAA+C,EAC/C;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QACnD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;KACnF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAC7B,UAAU,CAAC,oBAAoB,QAAQ,QAAQ,EAAE;QAC/C,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9B,CAAC,CACL,CAAC;AACJ,CAAC"}
@@ -1,7 +1,12 @@
1
1
  import { z } from "zod";
2
2
  import { bycrawlGet } from "../client.js";
3
3
  export function registerThreadsTools(server) {
4
- server.tool("threads_search_posts", "Search Threads posts by keyword", { query: z.string().describe("Search keyword"), count: z.number().optional().describe("Number of results (max 25)") }, async ({ query, count }) => bycrawlGet("/threads/posts/search", { q: query, count }));
4
+ server.tool("threads_search_posts", "Search Threads posts by keyword", {
5
+ query: z.string().describe("Search keyword"),
6
+ count: z.number().optional().describe("Number of results (max 25)"),
7
+ search_type: z.string().optional().describe("Sort order: top (default) or recent"),
8
+ cursor: z.string().optional().describe("Pagination cursor from previous response"),
9
+ }, async ({ query, count, search_type, cursor }) => bycrawlGet("/threads/posts/search", { q: query, count, search_type, cursor }));
5
10
  server.tool("threads_get_post", "Get a single Threads post by ID or shortcode", { postId: z.string().describe("Post ID or shortcode"), mode: z.enum(["full"]).optional().describe("Use 'full' for view counts") }, async ({ postId, mode }) => bycrawlGet(`/threads/posts/${postId}`, { mode }));
6
11
  server.tool("threads_get_posts_batch", "Get multiple Threads posts by IDs (batch)", { ids: z.string().describe("Comma-separated post IDs or shortcodes"), mode: z.enum(["full"]).optional().describe("Use 'full' for view counts") }, async ({ ids, mode }) => bycrawlGet("/threads/posts", { ids, mode }));
7
12
  server.tool("threads_search_users", "Search Threads users by username or name", { query: z.string().describe("Search query"), count: z.number().optional().describe("Number of results (max 25)") }, async ({ query, count }) => bycrawlGet("/threads/users/search", { q: query, count }));
@@ -11,6 +16,11 @@ export function registerThreadsTools(server) {
11
16
  cursor: z.string().optional().describe("Pagination cursor"),
12
17
  count: z.number().optional().describe("Number of results"),
13
18
  }, async ({ userId, cursor, count }) => bycrawlGet(`/threads/users/${userId}/posts`, { cursor, count }));
19
+ server.tool("threads_get_user_replies", "Get a Threads user's replies with pagination", {
20
+ userId: z.string().describe("Numeric user ID"),
21
+ cursor: z.string().optional().describe("Pagination cursor"),
22
+ count: z.number().optional().describe("Number of results"),
23
+ }, async ({ userId, cursor, count }) => bycrawlGet(`/threads/users/${userId}/replies`, { cursor, count }));
14
24
  server.tool("threads_get_public_feed", "Get Threads public For You feed", {
15
25
  cursor: z.string().optional().describe("Pagination cursor"),
16
26
  count: z.number().optional().describe("Number of items"),
@@ -1 +1 @@
1
- {"version":3,"file":"threads.js","sourceRoot":"","sources":["../../src/tools/threads.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"threads.js","sourceRoot":"","sources":["../../src/tools/threads.ts"],"names":[],"mappings":"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"}
@@ -22,5 +22,9 @@ export function registerTiktokTools(server) {
22
22
  keyword: z.string().describe("Search keyword"),
23
23
  count: z.number().optional().describe("Number of results (max 30)"),
24
24
  }, async ({ keyword, count }) => bycrawlGet("/tiktok/search", { keyword, count }));
25
+ server.tool("tiktok_get_video_subtitles", "Get subtitles/captions for a TikTok video", {
26
+ videoId: z.string().describe("TikTok video ID"),
27
+ language: z.string().optional().describe("Subtitle language code (e.g. en, ja, ko, zh-Hans)"),
28
+ }, async ({ videoId, language }) => bycrawlGet(`/tiktok/videos/${videoId}/subtitles`, { language }));
25
29
  }
26
30
  //# sourceMappingURL=tiktok.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tiktok.js","sourceRoot":"","sources":["../../src/tools/tiktok.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,UAAU,mBAAmB,CAAC,MAAiB;IACnD,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,uCAAuC,EACvC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,EACnD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAC/D,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,wCAAwC,EACxC;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAChD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;KAC1E,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,iBAAiB,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAClF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,8BAA8B,EAC9B;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAChD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;KACnE,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,iBAAiB,QAAQ,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,CACzF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,4BAA4B,EAC5B,kCAAkC,EAClC;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6DAA6D,CAAC;QACvG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;KACnE,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,oBAAoB,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CACrF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,2BAA2B,EAC3B,iCAAiC,EACjC;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAC/C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;KACnF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,kBAAkB,OAAO,WAAW,EAAE,EAAE,MAAM,EAAE,CAAC,CAC5F,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,iCAAiC,EACjC;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAC9C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;KACpE,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAC/E,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"tiktok.js","sourceRoot":"","sources":["../../src/tools/tiktok.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerYoutubeTools(server: McpServer): void;
@@ -0,0 +1,21 @@
1
+ import { z } from "zod";
2
+ import { bycrawlGet } from "../client.js";
3
+ export function registerYoutubeTools(server) {
4
+ server.tool("youtube_get_video", "Get YouTube video details by ID", { videoId: z.string().describe("YouTube video ID") }, async ({ videoId }) => bycrawlGet(`/youtube/videos/${videoId}`));
5
+ server.tool("youtube_get_channel", "Get YouTube channel info by channel ID or @handle", { channelId: z.string().describe("YouTube channel ID or @handle") }, async ({ channelId }) => bycrawlGet(`/youtube/channels/${channelId}`));
6
+ server.tool("youtube_search_videos", "Search YouTube videos by keyword", {
7
+ q: z.string().describe("Search query"),
8
+ count: z.number().optional().describe("Number of results (max 20)"),
9
+ cursor: z.string().optional().describe("Continuation token for pagination"),
10
+ }, async ({ q, count, cursor }) => bycrawlGet("/youtube/search", { q, count, cursor }));
11
+ server.tool("youtube_get_video_comments", "Get YouTube video comments", {
12
+ videoId: z.string().describe("YouTube video ID"),
13
+ count: z.number().optional().describe("Number of comments (max 50)"),
14
+ cursor: z.string().optional().describe("Continuation token for pagination"),
15
+ }, async ({ videoId, count, cursor }) => bycrawlGet(`/youtube/videos/${videoId}/comments`, { count, cursor }));
16
+ server.tool("youtube_get_video_transcription", "Get YouTube video transcription/subtitles with timestamps", {
17
+ videoId: z.string().describe("YouTube video ID"),
18
+ language: z.string().optional().describe("Language code (e.g., en, zh-Hant, ja)"),
19
+ }, async ({ videoId, language }) => bycrawlGet(`/youtube/videos/${videoId}/transcription`, { language }));
20
+ }
21
+ //# sourceMappingURL=youtube.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"youtube.js","sourceRoot":"","sources":["../../src/tools/youtube.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,iCAAiC,EACjC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,EACpD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAChE,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,mDAAmD,EACnD,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC,EAAE,EACnE,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,qBAAqB,SAAS,EAAE,CAAC,CACtE,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,kCAAkC,EAClC;QACE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QACtC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QACnE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;KAC5E,EACD,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,iBAAiB,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CACpF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,4BAA4B,EAC5B,4BAA4B,EAC5B;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAChD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QACpE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;KAC5E,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CACnC,UAAU,CAAC,mBAAmB,OAAO,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CACvE,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,iCAAiC,EACjC,2DAA2D,EAC3D;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAChD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;KAClF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAC9B,UAAU,CAAC,mBAAmB,OAAO,gBAAgB,EAAE,EAAE,QAAQ,EAAE,CAAC,CACvE,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function startHttp(): Promise<void>;
@@ -0,0 +1,142 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js";
3
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
4
+ import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
5
+ import { createServer } from "./server.js";
6
+ import { apiContextStorage } from "./api-context.js";
7
+ const PORT = parseInt(process.env.PORT ?? "3100", 10);
8
+ const HOST = process.env.HOST ?? "0.0.0.0";
9
+ // Session TTL: clean up sessions idle for more than 30 minutes
10
+ const SESSION_TTL_MS = 30 * 60 * 1000;
11
+ const sessions = {};
12
+ // --- Session TTL cleanup ---
13
+ setInterval(() => {
14
+ const now = Date.now();
15
+ for (const sid of Object.keys(sessions)) {
16
+ if (now - sessions[sid].lastActivity > SESSION_TTL_MS) {
17
+ console.log(`Session ${sid} expired (idle > ${SESSION_TTL_MS / 60000}min), closing`);
18
+ sessions[sid].transport.close().catch(() => { });
19
+ delete sessions[sid];
20
+ }
21
+ }
22
+ }, 60_000); // check every minute
23
+ // --- API key helpers ---
24
+ function extractApiKey(req) {
25
+ const bearer = req.headers.authorization;
26
+ if (bearer?.startsWith("Bearer "))
27
+ return bearer.slice(7);
28
+ const header = req.headers["x-bycrawl-api-key"];
29
+ if (typeof header === "string")
30
+ return header;
31
+ return undefined;
32
+ }
33
+ function requireApiKey(req, res) {
34
+ const apiKey = extractApiKey(req);
35
+ if (!apiKey) {
36
+ res.status(401).json({
37
+ error: "Missing API key. Provide via Authorization: Bearer <key> or x-bycrawl-api-key header.",
38
+ });
39
+ return undefined;
40
+ }
41
+ return apiKey;
42
+ }
43
+ function withApiKey(apiKey, handler) {
44
+ return apiContextStorage.run({ apiKey }, handler);
45
+ }
46
+ // --- Session helpers ---
47
+ function getSession(sessionId) {
48
+ const entry = sessions[sessionId];
49
+ if (entry)
50
+ entry.lastActivity = Date.now();
51
+ return entry;
52
+ }
53
+ export async function startHttp() {
54
+ const app = createMcpExpressApp({ host: HOST });
55
+ // Health check (no auth needed)
56
+ app.get("/health", (_req, res) => {
57
+ res.json({ status: "ok" });
58
+ });
59
+ // POST /mcp — MCP requests (initialize + subsequent calls)
60
+ app.post("/mcp", async (req, res) => {
61
+ const apiKey = requireApiKey(req, res);
62
+ if (!apiKey)
63
+ return;
64
+ await withApiKey(apiKey, async () => {
65
+ const sessionId = req.headers["mcp-session-id"];
66
+ // Existing session
67
+ if (sessionId) {
68
+ const entry = getSession(sessionId);
69
+ if (entry) {
70
+ await entry.transport.handleRequest(req, res, req.body);
71
+ return;
72
+ }
73
+ }
74
+ // New session (must be initialize request)
75
+ if (!sessionId && isInitializeRequest(req.body)) {
76
+ const transport = new StreamableHTTPServerTransport({
77
+ sessionIdGenerator: () => randomUUID(),
78
+ onsessioninitialized: (sid) => {
79
+ sessions[sid] = { transport, lastActivity: Date.now() };
80
+ },
81
+ });
82
+ transport.onclose = () => {
83
+ const sid = transport.sessionId;
84
+ if (sid && sessions[sid])
85
+ delete sessions[sid];
86
+ };
87
+ const server = createServer();
88
+ await server.connect(transport);
89
+ await transport.handleRequest(req, res, req.body);
90
+ return;
91
+ }
92
+ res.status(400).json({
93
+ jsonrpc: "2.0",
94
+ error: { code: -32000, message: "Bad Request: No valid session ID provided" },
95
+ id: null,
96
+ });
97
+ });
98
+ });
99
+ // GET /mcp — SSE stream (server-to-client notifications)
100
+ app.get("/mcp", async (req, res) => {
101
+ const apiKey = requireApiKey(req, res);
102
+ if (!apiKey)
103
+ return;
104
+ const sessionId = req.headers["mcp-session-id"];
105
+ const entry = getSession(sessionId);
106
+ if (!sessionId || !entry) {
107
+ res.status(400).json({ error: "Invalid or missing session ID" });
108
+ return;
109
+ }
110
+ await entry.transport.handleRequest(req, res);
111
+ });
112
+ // DELETE /mcp — End session
113
+ app.delete("/mcp", async (req, res) => {
114
+ const apiKey = requireApiKey(req, res);
115
+ if (!apiKey)
116
+ return;
117
+ const sessionId = req.headers["mcp-session-id"];
118
+ const entry = getSession(sessionId);
119
+ if (!sessionId || !entry) {
120
+ res.status(400).json({ error: "Invalid or missing session ID" });
121
+ return;
122
+ }
123
+ await entry.transport.handleRequest(req, res);
124
+ });
125
+ // Catch-all: any other route → 404 JSON
126
+ app.use((_req, res, _next) => {
127
+ res.status(404).json({ error: "Not found" });
128
+ });
129
+ app.listen(PORT, HOST, () => {
130
+ console.log(`ByCrawl MCP HTTP server listening on http://${HOST}:${PORT}/mcp`);
131
+ });
132
+ // Graceful shutdown
133
+ process.on("SIGINT", async () => {
134
+ console.log("Shutting down...");
135
+ for (const sid of Object.keys(sessions)) {
136
+ await sessions[sid].transport.close().catch(() => { });
137
+ delete sessions[sid];
138
+ }
139
+ process.exit(0);
140
+ });
141
+ }
142
+ //# sourceMappingURL=transport-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-http.js","sourceRoot":"","sources":["../src/transport-http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function startStdio(): Promise<void>;
@@ -0,0 +1,9 @@
1
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
2
+ import { createServer } from "./server.js";
3
+ export async function startStdio() {
4
+ const server = createServer();
5
+ const transport = new StdioServerTransport();
6
+ await server.connect(transport);
7
+ console.error("ByCrawl MCP server running on stdio");
8
+ }
9
+ //# sourceMappingURL=transport-stdio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-stdio.js","sourceRoot":"","sources":["../src/transport-stdio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;AACvD,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bycrawl/mcp",
3
- "version": "0.2.0",
4
- "description": "MCP server for ByCrawl — query 8 social media platforms (Threads, X, Facebook, Reddit, LinkedIn, Xiaohongshu, TikTok, Instagram) from AI agents",
3
+ "version": "0.4.0",
4
+ "description": "MCP server for ByCrawl — query 9+ social media platforms (Threads, X, Facebook, Reddit, LinkedIn, Xiaohongshu, TikTok, Instagram, YouTube) from AI agents",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "bycrawl-mcp": "./build/index.js"
@@ -12,8 +12,12 @@
12
12
  "scripts": {
13
13
  "build": "tsc",
14
14
  "dev": "tsx src/index.ts",
15
+ "dev:http": "TRANSPORT=http tsx src/index.ts",
16
+ "start": "node build/index.js",
17
+ "start:http": "TRANSPORT=http node build/index.js",
15
18
  "test": "vitest run",
16
19
  "test:smoke": "vitest run tests/smoke.test.ts",
20
+ "test:smoke-http": "vitest run tests/smoke-http.test.ts",
17
21
  "test:unit": "vitest run tests/client.unit.test.ts",
18
22
  "test:integration": "vitest run tests/platforms/",
19
23
  "test:integration:slow": "INCLUDE_SLOW=true vitest run tests/platforms/",
@@ -43,9 +47,11 @@
43
47
  "license": "MIT",
44
48
  "dependencies": {
45
49
  "@modelcontextprotocol/sdk": "^1.12.1",
50
+ "express": "^5.1.0",
46
51
  "zod": "^3.24.2"
47
52
  },
48
53
  "devDependencies": {
54
+ "@types/express": "^5.0.0",
49
55
  "@types/node": "^22.13.10",
50
56
  "tsx": "^4.19.3",
51
57
  "typescript": "^5.8.2",