forkfeed-mcp 1.0.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.
@@ -0,0 +1,232 @@
1
+ export const IMAGE_CATALOG = [
2
+ { id: "img1", name: "Server room on fire", tags: "disaster", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/1_202603270001.jpeg" },
3
+ { id: "img2", name: "Deploy to prod gone wrong", tags: "deploy, git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/2_202603270001.jpeg" },
4
+ { id: "img3", name: "Database corruption", tags: "disaster", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/3_202603270001.jpeg" },
5
+ { id: "img4", name: "Blue screen of death", tags: "debug, lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/4_202603270001.jpeg" },
6
+ { id: "img5", name: "Memory leak", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/5_202603270001.jpeg" },
7
+ { id: "img6", name: "DDoS attack", tags: "disaster, git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/6_202603270001.jpeg" },
8
+ { id: "img7", name: "SSL certificate expired", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/7_202603270001.jpeg" },
9
+ { id: "img8", name: "Cascading failure", tags: "disaster, git, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/8_202603270001.jpeg" },
10
+ { id: "img9", name: "Merge conflict", tags: "git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/9_202603270001.jpeg" },
11
+ { id: "img10", name: "Spaghetti code", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/10_202603270001.jpeg" },
12
+ { id: "img11", name: "Recursive infinite loop", tags: "hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/11_202603270001.jpeg" },
13
+ { id: "img12", name: "Prod is down at 3 AM", tags: "disaster, git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/12_202603270001.jpeg" },
14
+ { id: "img13", name: "Late night coding", tags: "lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/13_202603270001.jpeg" },
15
+ { id: "img14", name: "Pair programming", tags: "git, debug, hype, lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/14_202603270001.jpeg" },
16
+ { id: "img15", name: "Code review", tags: "git, debug", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/15_202603270001.jpeg" },
17
+ { id: "img16", name: "Rubber duck debugging", tags: "disaster, debug, hype, lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/16_202603270001.jpeg" },
18
+ { id: "img17", name: "Regex mastery", tags: "language", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/17_202603270001.jpeg" },
19
+ { id: "img18", name: "Git branching", tags: "git, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/18_202603270001.jpeg" },
20
+ { id: "img19", name: "Refactoring", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/19_202603270001.jpeg" },
21
+ { id: "img20", name: "CI/CD pipeline", tags: "deploy", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/20_202603270001.jpeg" },
22
+ { id: "img21", name: "Containerization", tags: "deploy, git, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/21_202603270001.jpeg" },
23
+ { id: "img22", name: "Microservices", tags: "hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/22_202603270001.jpeg" },
24
+ { id: "img23", name: "API integration", tags: "git, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/23_202603270001.jpeg" },
25
+ { id: "img24", name: "Terminal mastery", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/24_202603270001.jpeg" },
26
+ { id: "img25", name: "Cloud architecture", tags: "hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/25_202603270001.jpeg" },
27
+ { id: "img26", name: "Kubernetes orchestration", tags: "hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/26_202603270001.jpeg" },
28
+ { id: "img27", name: "Load balancer", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/27_202603270001.jpeg" },
29
+ { id: "img28", name: "Monitoring dashboard", tags: "debug, hype, lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/28_202603270001.jpeg" },
30
+ { id: "img29", name: "Firewall defense", tags: "disaster, git, victory", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/29_202603270001.jpeg" },
31
+ { id: "img30", name: "Network topology", tags: "debug", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/30_202603270001.jpeg" },
32
+ { id: "img31", name: "Server scaling", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/31_202603270001.jpeg" },
33
+ { id: "img32", name: "Backup and recovery", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/32_202603270001.jpeg" },
34
+ { id: "img33", name: "Successful deploy", tags: "deploy, victory", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/33_202603270001.jpeg" },
35
+ { id: "img34", name: "Bug squashed", tags: "disaster, deploy", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/34_202603270001.jpeg" },
36
+ { id: "img35", name: "Tests all passing", tags: "debug, victory", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/35_202603270001.jpeg" },
37
+ { id: "img36", name: "Feature shipped", tags: "disaster, deploy, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/36_202603270001.jpeg" },
38
+ { id: "img37", name: "Zero downtime migration", tags: "disaster", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/37_202603270001.jpeg" },
39
+ { id: "img38", name: "Performance optimized", tags: "hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/38_202603270001.jpeg" },
40
+ { id: "img39", name: "Code review approved", tags: "git, debug, victory", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/39_202603270001.jpeg" },
41
+ { id: "img40", name: "Friday deploy survived", tags: "deploy, hype, victory", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/40_202603270001.jpeg" },
42
+ { id: "img41", name: "It works on my machine", tags: "deploy, sarcastic", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/41_202603270001.jpeg" },
43
+ { id: "img42", name: "Stack Overflow copy paste", tags: "hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/42_202603270001.jpeg" },
44
+ { id: "img43", name: "Have you tried turning it off and on again", tags: "git, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/43_202603270001.jpeg" },
45
+ { id: "img44", name: "Meeting that could have been an email", tags: "workplace, hype, victory", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/44_202603270001.jpeg" },
46
+ { id: "img45", name: "TODO comments from 2015", tags: "deploy, debug", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/45_202603270001.jpeg" },
47
+ { id: "img46", name: "Temporary fix in prod for 3 years", tags: "git, debug", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/46_202603270001.jpeg" },
48
+ { id: "img47", name: "Reading someone else's code", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/47_202603270001.jpeg" },
49
+ { id: "img48", name: "Estimating story points", tags: "hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/48_202603270001.jpeg" },
50
+ { id: "img49", name: "Just a small change", tags: "deploy", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/49_202603270001.jpeg" },
51
+ { id: "img50", name: "The intern's first PR", tags: "git, beginner", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/50_Ghost_beside_glowing_202603271057.jpeg" },
52
+ { id: "img51", name: "Tabs vs spaces war", tags: "git, victory", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/51_202603270001.jpeg" },
53
+ { id: "img52", name: "Works in dev breaks in prod", tags: "disaster, git, hype, victory", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/52_202603270001.jpeg" },
54
+ { id: "img53", name: "Documentation nobody wrote", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/53_202603270001.jpeg" },
55
+ { id: "img54", name: "Googling the error message", tags: "disaster", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/54_202603270001.jpeg" },
56
+ { id: "img55", name: "Closing 100 tabs after fixing bug", tags: "disaster, git, debug", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/55_202603270001.jpeg" },
57
+ { id: "img56", name: "JavaScript callback hell", tags: "git, language", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/56_202603270001.jpeg" },
58
+ { id: "img57", name: "CSS centering a div", tags: "git, hype, language", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/57_202603270001.jpeg" },
59
+ { id: "img58", name: "Python indentation error", tags: "disaster, hype, language", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/58_202603270001.jpeg" },
60
+ { id: "img59", name: "Rust borrow checker", tags: "language", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/59_202603270001.jpeg" },
61
+ { id: "img60", name: "Java boilerplate", tags: "language", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/60_202603270001.jpeg" },
62
+ { id: "img61", name: "PHP legacy codebase", tags: "deploy, hype, language", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/61_202603270001.jpeg" },
63
+ { id: "img62", name: "Vim can't exit", tags: "disaster, git, hype, language, sarcastic, victory", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/62_202603270001.jpeg" },
64
+ { id: "img63", name: "TypeScript type gymnastics", tags: "git, language", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/63_202603270001.jpeg" },
65
+ { id: "img64", name: "SQL injection", tags: "disaster, deploy", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/64_202603270001.jpeg" },
66
+ { id: "img65", name: "Go goroutines", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/65_202603270001.jpeg" },
67
+ { id: "img66", name: "Design vs implementation", tags: "git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/66_202603270001.jpeg" },
68
+ { id: "img67", name: "React component hell", tags: "language, victory", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/67_202603270001.jpeg" },
69
+ { id: "img68", name: "Deadlock", tags: "deploy", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/68_202603270001.jpeg" },
70
+ { id: "img69", name: "Race condition", tags: "deploy", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/69_202603270001.jpeg" },
71
+ { id: "img70", name: "Null pointer exception", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/70_202603270001.jpeg" },
72
+ { id: "img71", name: "Off-by-one error", tags: "disaster, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/71_202603270001.jpeg" },
73
+ { id: "img72", name: "Dependency hell", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/72_202603270001.jpeg" },
74
+ { id: "img73", name: "Dark mode everything", tags: "hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/73_202603270001.jpeg" },
75
+ { id: "img74", name: "Hotfix at midnight", tags: "debug, lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/74_202603270001.jpeg" },
76
+ { id: "img75", name: "Rollback", tags: "deploy, git, victory", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/75_202603270001.jpeg" },
77
+ { id: "img76", name: "Feature flag wall", tags: "deploy", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/76_202603270001.jpeg" },
78
+ { id: "img77", name: "DNS propagation waiting", tags: "git, hype, victory", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/77_202603270001.jpeg" },
79
+ { id: "img78", name: "Cache invalidation", tags: "disaster, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/78_202603270001.jpeg" },
80
+ { id: "img79", name: "DevOps engineer juggling", tags: "deploy, debug, hype, lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/79_202603270001.jpeg" },
81
+ { id: "img80", name: "Data scientist in a sea of data", tags: "deploy", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/80_202603270001.jpeg" },
82
+ { id: "img81", name: "Frontend pixel-perfect obsession", tags: "hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/81_202603270001.jpeg" },
83
+ { id: "img82", name: "QA tester finding edge cases", tags: "debug", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/82_202603270001.jpeg" },
84
+ { id: "img83", name: "SRE on-call weekend", tags: "hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/83_202603270001.jpeg" },
85
+ { id: "img84", name: "DBA guarding the database", tags: "git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/84_202603270001.jpeg" },
86
+ { id: "img85", name: "Scrum ceremony", tags: "deploy, git, workplace", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/85_202603270001.jpeg" },
87
+ { id: "img86", name: "Tech lead whiteboarding", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/86_202603270001.jpeg" },
88
+ { id: "img87", name: "Junior dev first day", tags: "beginner, lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/87_202603270001.jpeg" },
89
+ { id: "img88", name: "Full stack stretched thin", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/88_202603270001.jpeg" },
90
+ { id: "img89", name: "Accidentally deleting production", tags: "deploy, git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/89_202603270001.jpeg" },
91
+ { id: "img90", name: "Fix creates 10 more bugs", tags: "disaster, git, debug", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/90_202603270001.jpeg" },
92
+ { id: "img91", name: "Code freeze", tags: "git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/91_202603270001.jpeg" },
93
+ { id: "img92", name: "Hackathon at 4 AM", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/92_202603270001.jpeg" },
94
+ { id: "img93", name: "Demo day goes wrong", tags: "disaster, git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/93_202603270001.jpeg" },
95
+ { id: "img94", name: "Finally reading the docs", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/94_202603270001.jpeg" },
96
+ { id: "img95", name: "Open source maintainer", tags: "disaster, git, hype, lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/95_202603270001.jpeg" },
97
+ { id: "img96", name: "Kubernetes pod crash loop", tags: "disaster, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/96_202603270001.jpeg" },
98
+ { id: "img97", name: "Monolith to microservices", tags: "hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/97_202603270001.jpeg" },
99
+ { id: "img98", name: "AI pair programmer", tags: "git, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/98_202603270001.jpeg" },
100
+ { id: "img99", name: "Log file drowning", tags: "disaster, debug", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/99_202603270001.jpeg" },
101
+ { id: "img100", name: "Weekend deploy peace", tags: "deploy, victory", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/100_202603270001.jpeg" },
102
+ { id: "img101", name: "Kid's first Hello World", tags: "git, debug, beginner, lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/101_202603270001.jpeg" },
103
+ { id: "img102", name: "Learning to code from YouTube tutorials", tags: "git, beginner", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/102_202603270001.jpeg" },
104
+ { id: "img103", name: "First time using the terminal", tags: "beginner", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/103_202603270001.jpeg" },
105
+ { id: "img104", name: "Copying code without understanding it", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/104_202603270001.jpeg" },
106
+ { id: "img105", name: "My first website with Comic Sans", tags: "git, beginner, victory", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/105_202603270001.jpeg" },
107
+ { id: "img106", name: "Variables named after pets", tags: "git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/106_202603270001.jpeg" },
108
+ { id: "img107", name: "500 lines in a single function", tags: "disaster", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/107_202603270001.jpeg" },
109
+ { id: "img108", name: "First GitHub repo no README", tags: "git, beginner", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/108_202603270001.jpeg" },
110
+ { id: "img109", name: "Console.log debugging expert", tags: "disaster, git, debug", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/109_202603270001.jpeg" },
111
+ { id: "img110", name: "Forgot to save before running", tags: "hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/110_202603270001.jpeg" },
112
+ { id: "img111", name: "First time breaking prod as an intern", tags: "disaster, git, beginner", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/111_202603270001.jpeg" },
113
+ { id: "img112", name: "Asking AI to write your homework", tags: "deploy, hype, lifestyle, victory", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/112_202603270001.jpeg" },
114
+ { id: "img113", name: "Committing node_modules", tags: "disaster, deploy, git, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/113_202603270001.jpeg" },
115
+ { id: "img114", name: "Naming variables x y z aa bb", tags: "git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/114_202603270001.jpeg" },
116
+ { id: "img115", name: "Infinite loop crashing the browser", tags: "disaster, git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/115_202603270001.jpeg" },
117
+ { id: "img116", name: "First try at CSS grid", tags: "git, beginner, language", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/116_202603270001.jpeg" },
118
+ { id: "img117", name: "Forgot the semicolon", tags: "disaster", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/117_202603270001.jpeg" },
119
+ { id: "img118", name: "47 open Chrome tabs of tutorials", tags: "beginner", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/118_202603270001.jpeg" },
120
+ { id: "img119", name: "git push --force to main on day one", tags: "git, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/119_202603270001.jpeg" },
121
+ { id: "img120", name: "Learning Python thinks they're a hacker", tags: "debug, beginner, language, lifestyle, sarcastic", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/120_202603270001.jpeg" },
122
+ { id: "img121", name: "HTML is a programming language debate", tags: "git, language", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/121_202603270001.jpeg" },
123
+ { id: "img122", name: "Watching coding tutorials at 2x speed", tags: "git, beginner", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/122_202603270001.jpeg" },
124
+ { id: "img123", name: "First API call returns 403", tags: "deploy, beginner", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/123_202603270001.jpeg" },
125
+ { id: "img124", name: "Discovered dark mode uses it everywhere", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/124_202603270001.jpeg" },
126
+ { id: "img125", name: "Installing every VS Code extension", tags: "hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/125_202603270001.jpeg" },
127
+ { id: "img126", name: "First time using regex", tags: "git, beginner, language", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/126_202603270001.jpeg" },
128
+ { id: "img127", name: "Printing the entire database to debug", tags: "disaster, git, debug", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/127_202603270001.jpeg" },
129
+ { id: "img128", name: "Nested if statements 10 levels deep", tags: "git, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/128_202603270001.jpeg" },
130
+ { id: "img129", name: "First code review getting destroyed", tags: "disaster, git, debug, beginner, hype, victory", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/129_202603270001.jpeg" },
131
+ { id: "img130", name: "Built a to-do app thinks they're a senior dev", tags: "git, sarcastic", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/130_202603270001.jpeg" },
132
+ { id: "img131", name: "Hardcoding API keys in the frontend", tags: "deploy", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/131_202603270001.jpeg" },
133
+ { id: "img132", name: "Using !important on every CSS rule", tags: "disaster, language", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/132_202603270001.jpeg" },
134
+ { id: "img133", name: "First standup saying still working on it", tags: "deploy, beginner, workplace", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/133_202603270001.jpeg" },
135
+ { id: "img134", name: "Wrote a script to automate a 5-second task", tags: "git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/134_202603270001.jpeg" },
136
+ { id: "img135", name: "Portfolio site more impressive than skills", tags: "git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/135_202603270001.jpeg" },
137
+ { id: "img136", name: "Accidentally exposed .env on GitHub", tags: "deploy, git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/136_202603270001.jpeg" },
138
+ { id: "img137", name: "First merge conflict emotional breakdown", tags: "disaster, git, beginner, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/137_202603270001.jpeg" },
139
+ { id: "img138", name: "Bootcamp grad applying to senior roles", tags: "beginner, sarcastic", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/138_202603270001.jpeg" },
140
+ { id: "img139", name: "I know HTML on LinkedIn", tags: "git, language, lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/139_202603270001.jpeg" },
141
+ { id: "img140", name: "Deploying Friday afternoon first time", tags: "deploy, beginner, lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/140_202603270001.jpeg" },
142
+ { id: "img141", name: "Tutorial hell infinite loop", tags: "git, beginner, victory", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/141_202603270001.jpeg" },
143
+ { id: "img142", name: "Copying Stack Overflow answer wrong", tags: "disaster, git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/142_202603270001.jpeg" },
144
+ { id: "img143", name: "Using a framework before learning the language", tags: "git, beginner", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/143_202603270001.jpeg" },
145
+ { id: "img144", name: "First time pair programming with a senior", tags: "git, debug, beginner, hype, lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/144_202603270001.jpeg" },
146
+ { id: "img145", name: "Writing clever code nobody can read", tags: "git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/145_202603270001.jpeg" },
147
+ { id: "img146", name: "Deleting someone else's branch by accident", tags: "deploy, git, debug", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/146_202603270001.jpeg" },
148
+ { id: "img147", name: "First pull request 3000 lines", tags: "git, debug, beginner", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/147_202603270001.jpeg" },
149
+ { id: "img148", name: "Stores everything in JSON files", tags: "git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/148_202603270001.jpeg" },
150
+ { id: "img149", name: "AI wrote the code doesn't know how it works", tags: "disaster, debug, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/149_202603270001.jpeg" },
151
+ { id: "img150", name: "Resume says 5 years experience has 5 months", tags: "hype, lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/150_202603270001.jpeg" },
152
+ { id: "img151", name: "It's not a bug it's a feature", tags: "disaster, git, sarcastic", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/151_202603270001.jpeg" },
153
+ { id: "img152", name: "My code is self-documenting", tags: "git, sarcastic", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/152_202603270001.jpeg" },
154
+ { id: "img153", name: "We'll document it later", tags: "git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/153_202603270001.jpeg" },
155
+ { id: "img154", name: "Quick 5-minute fix", tags: "debug", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/154_202603270001.jpeg" },
156
+ { id: "img155", name: "It compiles ship it", tags: "deploy, git, debug, hype, sarcastic", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/155_202603270001.jpeg" },
157
+ { id: "img156", name: "New JavaScript framework every week", tags: "git, language", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/156_202603270001.jpeg" },
158
+ { id: "img157", name: "Rewriting everything in Rust", tags: "language", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/157_202603270001.jpeg" },
159
+ { id: "img158", name: "We should rewrite from scratch", tags: "git, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/158_202603270001.jpeg" },
160
+ { id: "img159", name: "Stack Overflow is down", tags: "disaster, git, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/159_202603270001.jpeg" },
161
+ { id: "img160", name: "Microservices for a to-do app", tags: "git, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/160_202603270001.jpeg" },
162
+ { id: "img161", name: "Arguing about naming conventions for 3 hours", tags: "deploy, victory", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/161_202603270001.jpeg" },
163
+ { id: "img162", name: "Senior dev still using jQuery", tags: "deploy, git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/162_202603270001.jpeg" },
164
+ { id: "img163", name: "We don't need tests", tags: "disaster, deploy, git, debug, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/163_202603270001.jpeg" },
165
+ { id: "img164", name: "The 10x developer myth", tags: "disaster, deploy, git, debug, sarcastic", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/164_202603270001.jpeg" },
166
+ { id: "img165", name: "Copying senior's dotfiles without understanding", tags: "git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/165_202603270001.jpeg" },
167
+ { id: "img166", name: "Manager asking is it done yet", tags: "workplace, hype, lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/166_202603270001.jpeg" },
168
+ { id: "img167", name: "Standup became a 2-hour meeting", tags: "deploy, workplace, hype, victory", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/167_202603270001.jpeg" },
169
+ { id: "img168", name: "Sprint planning everything is 2 points", tags: "disaster, git, debug, workplace", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/168_202603270001.jpeg" },
170
+ { id: "img169", name: "I'll fix it in the next sprint", tags: "deploy, git, debug, workplace", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/169_202603270001.jpeg" },
171
+ { id: "img170", name: "Agile but actually waterfall", tags: "disaster, deploy, git, workplace, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/170_202603270001.jpeg" },
172
+ { id: "img171", name: "Quick question in Slack", tags: "git, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/171_202603270001.jpeg" },
173
+ { id: "img172", name: "Jira ticket description is just the title", tags: "workplace", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/172_202603270001.jpeg" },
174
+ { id: "img173", name: "Product owner changing requirements mid-sprint", tags: "git, workplace", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/173_202603270001.jpeg" },
175
+ { id: "img174", name: "Retro where nothing changes", tags: "deploy, workplace, victory", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/174_202603270001.jpeg" },
176
+ { id: "img175", name: "Tech debt sprint that never happens", tags: "git, workplace, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/175_202603270001.jpeg" },
177
+ { id: "img176", name: "Vibe-coding an entire startup", tags: "hype, lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/176_202603270001.jpeg" },
178
+ { id: "img177", name: "Adding AI to everything", tags: "git, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/177_202603270001.jpeg" },
179
+ { id: "img178", name: "Prompt engineering as a career", tags: "git, lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/178_202603270001.jpeg" },
180
+ { id: "img179", name: "Kubernetes for a static site", tags: "deploy, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/179_202603270001.jpeg" },
181
+ { id: "img180", name: "Docker container for one script", tags: "deploy, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/180_202603270001.jpeg" },
182
+ { id: "img181", name: "Serverless with a $50k bill", tags: "hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/181_202603270001.jpeg" },
183
+ { id: "img182", name: "Blockchain for a shopping list", tags: "hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/182_202603270001.jpeg" },
184
+ { id: "img183", name: "NFT of your git commit", tags: "git, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/183_202603270001.jpeg" },
185
+ { id: "img184", name: "Changing one CSS property breaks 47 things", tags: "disaster, git, language", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/184_202603270001.jpeg" },
186
+ { id: "img185", name: "The bug that only happens on Tuesdays", tags: "disaster, deploy, hype, victory", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/185_202603270001.jpeg" },
187
+ { id: "img186", name: "Works on localhost refuses to deploy", tags: "disaster, deploy, git, sarcastic", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/186_202603270001.jpeg" },
188
+ { id: "img187", name: "Debugging with print statements in production", tags: "disaster, git, debug", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/187_202603270001.jpeg" },
189
+ { id: "img188", name: "The fix that was just a missing comma", tags: "disaster, debug", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/188_202603270001.jpeg" },
190
+ { id: "img189", name: "Code works but nobody knows why", tags: "deploy, lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/189_202603270001.jpeg" },
191
+ { id: "img190", name: "Commented out code nobody dares delete", tags: "disaster, deploy, git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/190_202603270001.jpeg" },
192
+ { id: "img191", name: "Mechanical keyboard in an open office", tags: "lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/191_202603270001.jpeg" },
193
+ { id: "img192", name: "Standing desk evangelist", tags: "disaster, deploy, git, hype, lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/192_202603270001.jpeg" },
194
+ { id: "img193", name: "47 monitors one Slack window", tags: "debug, lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/193_202603270001.jpeg" },
195
+ { id: "img194", name: "Home office but actually bed office", tags: "git, lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/194_202603270001.jpeg" },
196
+ { id: "img195", name: "Coffee machine is the most critical infrastructure", tags: "git, debug, hype, lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/195_202603270001.jpeg" },
197
+ { id: "img196", name: "Explaining your job to family", tags: "deploy, git, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/196_202603270001.jpeg" },
198
+ { id: "img197", name: "Recruiter spam for a technology you used once", tags: "debug, hype, lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/197_202603270001.jpeg" },
199
+ { id: "img198", name: "Whiteboard interview solving problems you'll never use", tags: "git, lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/198_202603270001.jpeg" },
200
+ { id: "img199", name: "Open floor plan for collaboration", tags: "git, workplace, lifestyle, victory", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/199_202603270001.jpeg" },
201
+ { id: "img200", name: "The layoff email while servers are on fire", tags: "disaster, git, beginner, hype, sarcastic", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/200_202603270001.jpeg" },
202
+ { id: "bg1", name: "Error and disaster", tags: "disaster", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg1_202603270001.jpeg" },
203
+ { id: "bg2", name: "Code and terminal", tags: "disaster, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg2_202603270001.jpeg" },
204
+ { id: "bg3", name: "Infrastructure", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg3_202603270001.jpeg" },
205
+ { id: "bg4", name: "Celebration", tags: "hype, victory", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg4_202603270001.jpeg" },
206
+ { id: "bg5", name: "Debug", tags: "disaster, debug", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg5_202603270001.jpeg" },
207
+ { id: "bg6", name: "Network", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg6_202603270001.jpeg" },
208
+ { id: "bg7", name: "Security", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg7_202603270001.jpeg" },
209
+ { id: "bg8", name: "Deploy", tags: "deploy, git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg8_202603270001.jpeg" },
210
+ { id: "bg9", name: "Data", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg9_202603270001.jpeg" },
211
+ { id: "bg10", name: "Night coding", tags: "lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg10_202603270001.jpeg" },
212
+ { id: "bg11", name: "Meme and irony", tags: "hype, sarcastic", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg11_202603270001.jpeg" },
213
+ { id: "bg12", name: "JavaScript", tags: "deploy, language", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg12_202603270001.jpeg" },
214
+ { id: "bg13", name: "Python", tags: "language", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg13_202603270001.jpeg" },
215
+ { id: "bg14", name: "Rust", tags: "hype, language", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg14_202603270001.jpeg" },
216
+ { id: "bg15", name: "DevOps pipeline", tags: "deploy", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg15_202603270001.jpeg" },
217
+ { id: "bg16", name: "Data science", tags: "deploy", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg16_202603270001.jpeg" },
218
+ { id: "bg17", name: "Frontend design", tags: "hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg17_202603270001.jpeg" },
219
+ { id: "bg18", name: "QA testing", tags: "debug, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg18_202603270001.jpeg" },
220
+ { id: "bg19", name: "Deadlock and freeze", tags: "git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg19_202603270001.jpeg" },
221
+ { id: "bg20", name: "Legacy code", tags: "debug", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg20_202603270001.jpeg" },
222
+ { id: "bg21", name: "Hackathon energy", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg21_202603270001.jpeg" },
223
+ { id: "bg22", name: "Open source community", tags: "git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg22_202603270001.jpeg" },
224
+ { id: "bg23", name: "AI and machine learning", tags: "beginner, hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg23_202603270001.jpeg" },
225
+ { id: "bg24", name: "Mobile development", tags: "hype", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg24_202603270001.jpeg" },
226
+ { id: "bg25", name: "Startup hustle", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg25_202603270001.jpeg" },
227
+ { id: "bg26", name: "Enterprise corporate", tags: "git, debug", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg26_202603270001.jpeg" },
228
+ { id: "bg27", name: "Coffee and caffeine", tags: "git, hype, lifestyle", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg27_202603270001.jpeg" },
229
+ { id: "bg28", name: "Concurrency", tags: "general", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg28_202603270001.jpeg" },
230
+ { id: "bg29", name: "Version control", tags: "git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg29_202603270001.jpeg" },
231
+ { id: "bg30", name: "Zen productivity", tags: "deploy, git", url: "https://d5rfy0lpah1cz.cloudfront.net/content/push/bg30_202603270001.jpeg" },
232
+ ];
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,181 @@
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 { z } from 'zod';
5
+ import { GUIDE_CONTENT } from './guide-content.js';
6
+ import { IMAGE_CATALOG } from './image-catalog.js';
7
+ const APP_SERVER_URL = (process.env.APP_SERVER_URL || 'https://api.forkfeed.link').replace(/\/+$/, '');
8
+ const TOKEN = process.env.FORKFEED_TOKEN || '';
9
+ // ── Helpers ────────────────────────────────────────────────────────────
10
+ function authHeaders() {
11
+ return {
12
+ 'Content-Type': 'application/json',
13
+ Authorization: `Bearer ${TOKEN}`,
14
+ };
15
+ }
16
+ // ── MCP Server ─────────────────────────────────────────────────────────
17
+ const server = new McpServer({
18
+ name: 'forkfeed',
19
+ version: '1.0.0',
20
+ });
21
+ // ── Tool: forkfeed_guide ───────────────────────────────────────────────
22
+ server.tool('forkfeed_guide', 'Get the complete guide for generating forkfeed content from GitHub commits. Call this first to learn the format before generating content.', {}, async () => ({
23
+ content: [{ type: 'text', text: GUIDE_CONTENT }],
24
+ }));
25
+ // ── Tool: forkfeed_images ──────────────────────────────────────────────
26
+ server.tool('forkfeed_images', 'Get the IT Scenes image catalog (200 scene images + 30 backgrounds). Use this to pick images that match your content by tags and name. Call after forkfeed_guide.', {}, async () => {
27
+ const scenes = IMAGE_CATALOG.filter((i) => i.id.startsWith('img'));
28
+ const bgs = IMAGE_CATALOG.filter((i) => i.id.startsWith('bg'));
29
+ const lines = [
30
+ '# IT Scenes Image Catalog',
31
+ '',
32
+ 'Match images to content by tags and name. Use img* for covers and inline images, bg* for card backgrounds.',
33
+ '',
34
+ 'Tags: deploy, git, disaster, debug, hype, victory, beginner, language, lifestyle, workplace, sarcastic, general',
35
+ '',
36
+ '## Scene Images (covers + inline)',
37
+ '',
38
+ ...scenes.map((i) => `${i.id} | ${i.name} | ${i.tags} | ${i.url}`),
39
+ '',
40
+ '## Background Images',
41
+ '',
42
+ ...bgs.map((i) => `${i.id} | ${i.name} | ${i.tags} | ${i.url}`),
43
+ ];
44
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
45
+ });
46
+ // ── Tool: forkfeed_push ────────────────────────────────────────────────
47
+ server.tool('forkfeed_push', 'Push a generated manifest (forks, feeds, cards) to forkfeed. The manifest JSON must conform to the structure described in forkfeed_guide.', {
48
+ manifest: z
49
+ .object({
50
+ forks: z.array(z.any()),
51
+ feeds: z.array(z.any()),
52
+ cards: z.array(z.any()),
53
+ })
54
+ .describe('The complete manifest with forks, feeds, and cards arrays'),
55
+ }, async ({ manifest }) => {
56
+ if (!TOKEN) {
57
+ return {
58
+ content: [
59
+ {
60
+ type: 'text',
61
+ text: 'Error: FORKFEED_TOKEN not set. Get your API token from forkfeed.link/admin/user/token and add it to your .mcp.json env.',
62
+ },
63
+ ],
64
+ isError: true,
65
+ };
66
+ }
67
+ try {
68
+ const res = await fetch(`${APP_SERVER_URL}/api/content/push`, {
69
+ method: 'POST',
70
+ headers: authHeaders(),
71
+ body: JSON.stringify({ manifest }),
72
+ });
73
+ const data = await res.json();
74
+ if (!res.ok) {
75
+ return {
76
+ content: [
77
+ {
78
+ type: 'text',
79
+ text: `Push failed (${res.status}): ${data.error || JSON.stringify(data)}`,
80
+ },
81
+ ],
82
+ isError: true,
83
+ };
84
+ }
85
+ const forkSummary = data.forks
86
+ ?.map((f) => ` - ${f.title} (${f.feeds} feeds)`)
87
+ .join('\n');
88
+ return {
89
+ content: [
90
+ {
91
+ type: 'text',
92
+ text: [
93
+ 'Content pushed successfully!',
94
+ '',
95
+ `Uploaded: ${data.uploaded?.feeds || 0} feeds, ${data.uploaded?.cards || 0} cards`,
96
+ '',
97
+ 'Forks:',
98
+ forkSummary || ' (none)',
99
+ '',
100
+ 'Your content is now live in the forkfeed app. It starts as private.',
101
+ 'To make it public, change visibility in the app (requires admin approval).',
102
+ ].join('\n'),
103
+ },
104
+ ],
105
+ };
106
+ }
107
+ catch (err) {
108
+ return {
109
+ content: [
110
+ {
111
+ type: 'text',
112
+ text: `Push failed: ${err instanceof Error ? err.message : String(err)}`,
113
+ },
114
+ ],
115
+ isError: true,
116
+ };
117
+ }
118
+ });
119
+ // ── Tool: forkfeed_status ──────────────────────────────────────────────
120
+ server.tool('forkfeed_status', 'Check your current forkfeed content: which forks and feeds you have published.', {}, async () => {
121
+ if (!TOKEN) {
122
+ return {
123
+ content: [
124
+ {
125
+ type: 'text',
126
+ text: 'Error: FORKFEED_TOKEN not set. Get your API token from forkfeed.link/admin/user/token and add it to your .mcp.json env.',
127
+ },
128
+ ],
129
+ isError: true,
130
+ };
131
+ }
132
+ try {
133
+ const res = await fetch(`${APP_SERVER_URL}/api/content/status`, {
134
+ headers: authHeaders(),
135
+ });
136
+ const data = await res.json();
137
+ if (!res.ok) {
138
+ return {
139
+ content: [
140
+ {
141
+ type: 'text',
142
+ text: `Status check failed (${res.status}): ${data.error || JSON.stringify(data)}`,
143
+ },
144
+ ],
145
+ isError: true,
146
+ };
147
+ }
148
+ if (!data.forks?.length) {
149
+ return {
150
+ content: [
151
+ {
152
+ type: 'text',
153
+ text: 'No forks published yet. Use forkfeed_guide to learn how to generate content, then push it with forkfeed_push.',
154
+ },
155
+ ],
156
+ };
157
+ }
158
+ const lines = ['Your forkfeed content:', ''];
159
+ for (const fork of data.forks) {
160
+ lines.push(`Fork: ${fork.title} (${fork.externalForkId})`);
161
+ lines.push(` Visibility: ${fork.visibility}`);
162
+ lines.push(` Feeds: ${fork.feeds}`);
163
+ lines.push('');
164
+ }
165
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
166
+ }
167
+ catch (err) {
168
+ return {
169
+ content: [
170
+ {
171
+ type: 'text',
172
+ text: `Status check failed: ${err instanceof Error ? err.message : String(err)}`,
173
+ },
174
+ ],
175
+ isError: true,
176
+ };
177
+ }
178
+ });
179
+ // ── Start ──────────────────────────────────────────────────────────────
180
+ const transport = new StdioServerTransport();
181
+ await server.connect(transport);
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "forkfeed-mcp",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for pushing GitHub commits to forkfeed",
5
+ "type": "module",
6
+ "bin": {
7
+ "forkfeed-mcp": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "dev": "tsc --watch",
15
+ "start": "node dist/index.js"
16
+ },
17
+ "dependencies": {
18
+ "@modelcontextprotocol/sdk": "^1.12.1"
19
+ },
20
+ "devDependencies": {
21
+ "typescript": "^5.7.0",
22
+ "@types/node": "^22.0.0"
23
+ },
24
+ "engines": {
25
+ "node": ">=18"
26
+ },
27
+ "license": "MIT"
28
+ }