@cyanheads/bluesky-mcp-server 0.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.
Files changed (53) hide show
  1. package/AGENTS.md +346 -0
  2. package/CLAUDE.md +346 -0
  3. package/Dockerfile +99 -0
  4. package/LICENSE +201 -0
  5. package/README.md +307 -0
  6. package/changelog/0.1.x/0.1.1.md +24 -0
  7. package/changelog/template.md +127 -0
  8. package/dist/index.d.ts +7 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +43 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/mcp-server/resources/definitions/bsky-profile.resource.d.ts +15 -0
  13. package/dist/mcp-server/resources/definitions/bsky-profile.resource.d.ts.map +1 -0
  14. package/dist/mcp-server/resources/definitions/bsky-profile.resource.js +54 -0
  15. package/dist/mcp-server/resources/definitions/bsky-profile.resource.js.map +1 -0
  16. package/dist/mcp-server/tools/definitions/bsky-get-author-feed.tool.d.ts +49 -0
  17. package/dist/mcp-server/tools/definitions/bsky-get-author-feed.tool.d.ts.map +1 -0
  18. package/dist/mcp-server/tools/definitions/bsky-get-author-feed.tool.js +217 -0
  19. package/dist/mcp-server/tools/definitions/bsky-get-author-feed.tool.js.map +1 -0
  20. package/dist/mcp-server/tools/definitions/bsky-get-follows.tool.d.ts +43 -0
  21. package/dist/mcp-server/tools/definitions/bsky-get-follows.tool.d.ts.map +1 -0
  22. package/dist/mcp-server/tools/definitions/bsky-get-follows.tool.js +165 -0
  23. package/dist/mcp-server/tools/definitions/bsky-get-follows.tool.js.map +1 -0
  24. package/dist/mcp-server/tools/definitions/bsky-get-post-thread.tool.d.ts +24 -0
  25. package/dist/mcp-server/tools/definitions/bsky-get-post-thread.tool.d.ts.map +1 -0
  26. package/dist/mcp-server/tools/definitions/bsky-get-post-thread.tool.js +166 -0
  27. package/dist/mcp-server/tools/definitions/bsky-get-post-thread.tool.js.map +1 -0
  28. package/dist/mcp-server/tools/definitions/bsky-get-profile.tool.d.ts +32 -0
  29. package/dist/mcp-server/tools/definitions/bsky-get-profile.tool.d.ts.map +1 -0
  30. package/dist/mcp-server/tools/definitions/bsky-get-profile.tool.js +117 -0
  31. package/dist/mcp-server/tools/definitions/bsky-get-profile.tool.js.map +1 -0
  32. package/dist/mcp-server/tools/definitions/bsky-get-trending.tool.d.ts +21 -0
  33. package/dist/mcp-server/tools/definitions/bsky-get-trending.tool.d.ts.map +1 -0
  34. package/dist/mcp-server/tools/definitions/bsky-get-trending.tool.js +81 -0
  35. package/dist/mcp-server/tools/definitions/bsky-get-trending.tool.js.map +1 -0
  36. package/dist/mcp-server/tools/definitions/bsky-search-actors.tool.d.ts +27 -0
  37. package/dist/mcp-server/tools/definitions/bsky-search-actors.tool.d.ts.map +1 -0
  38. package/dist/mcp-server/tools/definitions/bsky-search-actors.tool.js +100 -0
  39. package/dist/mcp-server/tools/definitions/bsky-search-actors.tool.js.map +1 -0
  40. package/dist/mcp-server/tools/definitions/bsky-search-posts.tool.d.ts +47 -0
  41. package/dist/mcp-server/tools/definitions/bsky-search-posts.tool.d.ts.map +1 -0
  42. package/dist/mcp-server/tools/definitions/bsky-search-posts.tool.js +233 -0
  43. package/dist/mcp-server/tools/definitions/bsky-search-posts.tool.js.map +1 -0
  44. package/dist/services/bluesky/bluesky-service.d.ts +68 -0
  45. package/dist/services/bluesky/bluesky-service.d.ts.map +1 -0
  46. package/dist/services/bluesky/bluesky-service.js +287 -0
  47. package/dist/services/bluesky/bluesky-service.js.map +1 -0
  48. package/dist/services/bluesky/types.d.ts +126 -0
  49. package/dist/services/bluesky/types.d.ts.map +1 -0
  50. package/dist/services/bluesky/types.js +6 -0
  51. package/dist/services/bluesky/types.js.map +1 -0
  52. package/package.json +102 -0
  53. package/server.json +99 -0
@@ -0,0 +1,126 @@
1
+ /**
2
+ * @fileoverview Domain types for the Bluesky AT Protocol AppView service.
3
+ * @module services/bluesky/types
4
+ */
5
+ /** A Bluesky actor label (moderation / content warning). */
6
+ export interface Label {
7
+ cts?: string;
8
+ src?: string;
9
+ val: string;
10
+ }
11
+ /** Normalized embed union — images, external link cards, quoted posts, or videos. */
12
+ export type Embed = {
13
+ type: 'images';
14
+ images: Array<{
15
+ url: string;
16
+ alt: string;
17
+ aspectRatio?: {
18
+ width: number;
19
+ height: number;
20
+ };
21
+ }>;
22
+ } | {
23
+ type: 'external';
24
+ uri: string;
25
+ title: string;
26
+ description: string;
27
+ thumb?: string;
28
+ } | {
29
+ type: 'record';
30
+ uri: string;
31
+ cid: string;
32
+ text?: string;
33
+ authorHandle?: string;
34
+ } | {
35
+ type: 'video';
36
+ playlist?: string;
37
+ thumbnail?: string;
38
+ presentation?: string;
39
+ aspectRatio?: {
40
+ width: number;
41
+ height: number;
42
+ };
43
+ } | {
44
+ type: 'unknown';
45
+ raw: string;
46
+ };
47
+ /** Public actor profile returned by getProfile / searchActors / etc. */
48
+ export interface ActorProfile {
49
+ avatar?: string;
50
+ createdAt?: string;
51
+ description?: string;
52
+ did: string;
53
+ displayName?: string;
54
+ followersCount?: number;
55
+ followsCount?: number;
56
+ handle: string;
57
+ indexedAt?: string;
58
+ labels?: Label[];
59
+ /** AT-URI of pinned post, if present. */
60
+ pinnedPostUri?: string;
61
+ postsCount?: number;
62
+ }
63
+ /** A single post view (feed items + search results share this shape). */
64
+ export interface PostView {
65
+ author: ActorProfile;
66
+ cid: string;
67
+ createdAt?: string;
68
+ embed?: Embed;
69
+ indexedAt?: string;
70
+ labels?: Label[];
71
+ likeCount?: number;
72
+ quoteCount?: number;
73
+ replyCount?: number;
74
+ /** For replies: the immediate parent AT-URI. */
75
+ replyToUri?: string;
76
+ repostCount?: number;
77
+ text: string;
78
+ uri: string;
79
+ }
80
+ /** A thread node in a post thread response. */
81
+ export interface ThreadPost {
82
+ /** True when the API indicates this post was not found (deleted). */
83
+ notFound?: boolean;
84
+ parent?: ThreadPost;
85
+ post: PostView;
86
+ replies?: ThreadPost[];
87
+ /** True when the API truncated deeper replies at this node. */
88
+ truncated?: boolean;
89
+ }
90
+ /** Result of searchPosts. */
91
+ export interface SearchPostsResult {
92
+ cursor?: string;
93
+ hitsTotal?: number;
94
+ posts: PostView[];
95
+ }
96
+ /** Result of getAuthorFeed. */
97
+ export interface AuthorFeedResult {
98
+ cursor?: string;
99
+ feed: PostView[];
100
+ }
101
+ /** Result of searchActors. */
102
+ export interface SearchActorsResult {
103
+ actors: ActorProfile[];
104
+ cursor?: string;
105
+ }
106
+ /** Result of getFollowers / getFollows. */
107
+ export interface GraphResult {
108
+ actors: ActorProfile[];
109
+ cursor?: string;
110
+ subject: ActorProfile;
111
+ }
112
+ /** A single trending topic. */
113
+ export interface TrendingTopic {
114
+ category?: string;
115
+ displayName: string;
116
+ link?: string;
117
+ postCount?: number;
118
+ startedAt?: string;
119
+ status?: string;
120
+ topic: string;
121
+ }
122
+ /** Result of getTrends. */
123
+ export interface TrendsResult {
124
+ trends: TrendingTopic[];
125
+ }
126
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/bluesky/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @fileoverview Domain types for the Bluesky AT Protocol AppView service.
3
+ * @module services/bluesky/types
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/bluesky/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
package/package.json ADDED
@@ -0,0 +1,102 @@
1
+ {
2
+ "name": "@cyanheads/bluesky-mcp-server",
3
+ "version": "0.1.1",
4
+ "mcpName": "io.github.cyanheads/bluesky-mcp-server",
5
+ "description": "Search posts, profiles, feeds, threads, and trending topics on Bluesky via MCP. STDIO or Streamable HTTP.",
6
+ "type": "module",
7
+ "main": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "bin": {
10
+ "bluesky-mcp-server": "dist/index.js"
11
+ },
12
+ "files": [
13
+ "changelog/",
14
+ "dist/",
15
+ "README.md",
16
+ "LICENSE",
17
+ "CLAUDE.md",
18
+ "AGENTS.md",
19
+ "Dockerfile",
20
+ "server.json"
21
+ ],
22
+ "scripts": {
23
+ "build": "bun run scripts/build.ts",
24
+ "rebuild": "bun run scripts/clean.ts && bun run scripts/build.ts",
25
+ "clean": "bun run scripts/clean.ts",
26
+ "devcheck": "bun run scripts/devcheck.ts",
27
+ "audit:refresh": "rm -f bun.lock && bun install && bun audit",
28
+ "tree": "bun run scripts/tree.ts",
29
+ "list-skills": "bun run scripts/list-skills.ts",
30
+ "format": "biome check --write .",
31
+ "format:unsafe": "biome check --write --unsafe .",
32
+ "lint:mcp": "bun run scripts/lint-mcp.ts",
33
+ "lint:packaging": "bun run scripts/lint-packaging.ts",
34
+ "bundle": "npm run build && npx -y @anthropic-ai/mcpb pack . dist/bluesky-mcp-server.mcpb",
35
+ "changelog:build": "bun run scripts/build-changelog.ts",
36
+ "changelog:check": "bun run scripts/build-changelog.ts --check",
37
+ "release:github": "bun run scripts/release-github.ts",
38
+ "publish-mcp": "mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish",
39
+ "test": "vitest run",
40
+ "start": "node dist/index.js",
41
+ "start:stdio": "MCP_TRANSPORT_TYPE=stdio node dist/index.js",
42
+ "start:http": "MCP_TRANSPORT_TYPE=http node dist/index.js"
43
+ },
44
+ "keywords": [
45
+ "bluesky",
46
+ "atproto",
47
+ "at-protocol",
48
+ "social-media",
49
+ "social-listening",
50
+ "trending",
51
+ "mcp",
52
+ "mcp-server",
53
+ "model-context-protocol",
54
+ "typescript",
55
+ "bun",
56
+ "stdio",
57
+ "streamable-http",
58
+ "ai-agent"
59
+ ],
60
+ "repository": {
61
+ "type": "git",
62
+ "url": "git+https://github.com/cyanheads/bluesky-mcp-server.git"
63
+ },
64
+ "bugs": {
65
+ "url": "https://github.com/cyanheads/bluesky-mcp-server/issues"
66
+ },
67
+ "homepage": "https://github.com/cyanheads/bluesky-mcp-server#readme",
68
+ "author": "cyanheads <casey@caseyjhand.com> (https://github.com/cyanheads/bluesky-mcp-server#readme)",
69
+ "funding": [
70
+ {
71
+ "type": "github",
72
+ "url": "https://github.com/sponsors/cyanheads"
73
+ },
74
+ {
75
+ "type": "buy_me_a_coffee",
76
+ "url": "https://www.buymeacoffee.com/cyanheads"
77
+ }
78
+ ],
79
+ "license": "Apache-2.0",
80
+ "packageManager": "bun@1.3.11",
81
+ "engines": {
82
+ "bun": ">=1.3.0",
83
+ "node": ">=24.0.0"
84
+ },
85
+ "publishConfig": {
86
+ "access": "public"
87
+ },
88
+ "dependencies": {
89
+ "@cyanheads/mcp-ts-core": "^0.9.21",
90
+ "pino-pretty": "^13.1.3",
91
+ "zod": "^4.4.3"
92
+ },
93
+ "devDependencies": {
94
+ "@biomejs/biome": "^2.4.16",
95
+ "@types/node": "^25.9.1",
96
+ "depcheck": "^1.4.7",
97
+ "ignore": "^7.0.5",
98
+ "tsc-alias": "^1.8.17",
99
+ "typescript": "^6.0.3",
100
+ "vitest": "^4.1.8"
101
+ }
102
+ }
package/server.json ADDED
@@ -0,0 +1,99 @@
1
+ {
2
+ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
+ "name": "io.github.cyanheads/bluesky-mcp-server",
4
+ "description": "Search posts, profiles, feeds, threads, and trending topics on Bluesky.",
5
+ "repository": {
6
+ "url": "https://github.com/cyanheads/bluesky-mcp-server",
7
+ "source": "github"
8
+ },
9
+ "version": "0.1.1",
10
+ "packages": [
11
+ {
12
+ "registryType": "npm",
13
+ "registryBaseUrl": "https://registry.npmjs.org",
14
+ "identifier": "@cyanheads/bluesky-mcp-server",
15
+ "runtimeHint": "bun",
16
+ "version": "0.1.1",
17
+ "packageArguments": [
18
+ {
19
+ "type": "positional",
20
+ "value": "run"
21
+ },
22
+ {
23
+ "type": "positional",
24
+ "value": "start:stdio"
25
+ }
26
+ ],
27
+ "environmentVariables": [
28
+ {
29
+ "name": "MCP_LOG_LEVEL",
30
+ "description": "Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').",
31
+ "format": "string",
32
+ "isRequired": false,
33
+ "default": "info"
34
+ }
35
+ ],
36
+ "transport": {
37
+ "type": "stdio"
38
+ }
39
+ },
40
+ {
41
+ "registryType": "npm",
42
+ "registryBaseUrl": "https://registry.npmjs.org",
43
+ "identifier": "@cyanheads/bluesky-mcp-server",
44
+ "runtimeHint": "bun",
45
+ "version": "0.1.1",
46
+ "packageArguments": [
47
+ {
48
+ "type": "positional",
49
+ "value": "run"
50
+ },
51
+ {
52
+ "type": "positional",
53
+ "value": "start:http"
54
+ }
55
+ ],
56
+ "environmentVariables": [
57
+ {
58
+ "name": "MCP_HTTP_HOST",
59
+ "description": "The hostname for the HTTP server.",
60
+ "format": "string",
61
+ "isRequired": false,
62
+ "default": "127.0.0.1"
63
+ },
64
+ {
65
+ "name": "MCP_HTTP_PORT",
66
+ "description": "The port to run the HTTP server on.",
67
+ "format": "string",
68
+ "isRequired": false,
69
+ "default": "3010"
70
+ },
71
+ {
72
+ "name": "MCP_HTTP_ENDPOINT_PATH",
73
+ "description": "The endpoint path for the MCP server.",
74
+ "format": "string",
75
+ "isRequired": false,
76
+ "default": "/mcp"
77
+ },
78
+ {
79
+ "name": "MCP_AUTH_MODE",
80
+ "description": "Authentication mode to use: 'none', 'jwt', or 'oauth'.",
81
+ "format": "string",
82
+ "isRequired": false,
83
+ "default": "none"
84
+ },
85
+ {
86
+ "name": "MCP_LOG_LEVEL",
87
+ "description": "Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').",
88
+ "format": "string",
89
+ "isRequired": false,
90
+ "default": "info"
91
+ }
92
+ ],
93
+ "transport": {
94
+ "type": "streamable-http",
95
+ "url": "http://localhost:3010/mcp"
96
+ }
97
+ }
98
+ ]
99
+ }