animal-personality-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.
package/README.md ADDED
@@ -0,0 +1,37 @@
1
+ # Animal Personality MCP Server
2
+
3
+ 动物系人格测试 MCP Server — 你是哪种动物?32道幽默题目,情绪价值拉满的人格报告。
4
+
5
+ 8种动物人格:狮子、海豚、老鹰、狼、猫、兔子、狐狸、熊。
6
+
7
+ ## 使用方法
8
+
9
+ ```bash
10
+ npx -y animal-personality-mcp
11
+ ```
12
+
13
+ ## 工具
14
+
15
+ | 工具名 | 说明 |
16
+ |--------|------|
17
+ | `start_animal_test` | 开始测试,获取第一道题目 |
18
+ | `answer_question` | 提交当前题目答案(1-5分),获取下一题 |
19
+ | `get_progress` | 查看答题进度 |
20
+ | `calculate_animal_result` | 全部答完后获取完整人格报告 |
21
+
22
+ ## 报告内容
23
+
24
+ - 人格类型 + emoji + 详细描述
25
+ - 专属 cheers(情绪价值文案)
26
+ - 最适合你的场景/角色 (perfectMatch)
27
+ - 你的野生生存技能 (wildSurvivalSkill)
28
+ - 最适合你的栖息地 (idealHabitat)
29
+ - 温柔的陪伴建议 (advice)
30
+
31
+ ## 开发
32
+
33
+ ```bash
34
+ npm install
35
+ npm run build
36
+ npm run dev
37
+ ```
@@ -0,0 +1,3 @@
1
+ import { Answer, TestResult } from './types.js';
2
+ export declare function calculateResult(answers: Answer[]): TestResult;
3
+ //# sourceMappingURL=calculator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculator.d.ts","sourceRoot":"","sources":["../src/calculator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAgGhD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,UAAU,CA8B7D"}
@@ -0,0 +1,111 @@
1
+ const animalProfiles = {
2
+ lion: {
3
+ name: '狮子',
4
+ emoji: '🦁',
5
+ desc: '你是天生的领导者,身上有一种不怒自威又让人想追随的气场。你不一定嗓门最大,但你开口时别人会安静听完。你习惯于承担责任、冲在前面,有时候甚至忘了问自己"累不累"——因为你觉得那是你的草原,理应由你来守护。',
6
+ cheers: '你知道吗?能扛事的人很多,但能让别人心甘情愿跟着你跑的人太少了。你的领导力不是命令,是感染力——你站在那里,别人就觉得自己也能做到。这种能力很多人学一辈子也学不会,你天生自带。累了就趴下晒会太阳,草原没你照样转——但有你转得更漂亮。',
7
+ perfectMatch: '团队里的定海神针、不管什么局都能控场的人、被朋友偷偷叫"大哥/大姐"但你本人永远不好意思承认',
8
+ advice: '领导别人之前,先学会照顾好自己。你不需要在每一个时刻都做那个"不能被击败"的人。偶尔示弱不是软弱——让信任的人帮你扛一下,他们会觉得自己被需要了,而你也终于可以喘口气。狮子的鬃毛也需要梳理,不是吗?',
9
+ wildSurvivalSkill: '你的野生生存技能是"气场压制"——你不需要动手,只需要缓缓转个头,周围的混乱就会自动平息。这是草原之王才有的天赋:不怒而威、不动而服。你在危机中不是最慌的那个,而是所有人看向的那个。',
10
+ idealHabitat: '一个需要方向感的团队、一个有自由决策权的平台、以及一张软到可以蜷起来的大沙发。你需要一片足够大的草原来奔跑,但也要有地方让你卸下鬃毛,当一只普通的——不是狮子,就是你自己。',
11
+ },
12
+ dolphin: {
13
+ name: '海豚',
14
+ emoji: '🐬',
15
+ desc: '你是社交圈的天然导航系统——聪明、温暖、自带善意光环。你能在最短的时间里让陌生人变成熟人、熟人变成朋友、朋友变成愿意帮你开一整晚车的那种。你的快乐是会传染的,别人跟你在一块待久了,连走路都开始蹦跶。',
16
+ cheers: '这个世界上的"聪明人"很多,但聪明到让人舒服的人没几个。你是那种既能把事情想透、又能把事情讲得让人笑着听进去的天才。你不需要在每条深海里都当领航员,有时候在浪花上翻个跟头,大家也会因为你的存在而开心一整天。',
17
+ perfectMatch: '聚会里最会串场的人、团队情绪的天气预报、无论什么群聊只要你一来就活起来的那个关键变量',
18
+ advice: '你习惯照顾好所有人的情绪,但你的情绪也需要被照顾。不是每一次冷场都需要你来救,不是每一份沉默都是你的责任。偶尔游到深水区自己待一会,没人会觉得你失去了光芒——海豚也得换气的嘛。',
19
+ wildSurvivalSkill: '你的野生生存技能是"声呐共情"——你用内置的情绪声呐扫描全场,精准定位每一丝不安、每一寸尴尬,然后一个漂亮的弧度游过去轻松化解。别人花一年才能建立的信任,你用一杯咖啡的时间就能搞定。这是你从大海里带来的天赋。',
20
+ idealHabitat: '一群人围坐的热闹角落、一个能让你自由发挥创意的舞台、以及一片偶尔可以独自畅游的安静海域。你需要社交的浪花,也需要深潜的宁静——两者的切换对你来说就像呼吸一样自然。',
21
+ },
22
+ eagle: {
23
+ name: '老鹰',
24
+ emoji: '🦅',
25
+ desc: '你是那个在所有人低头赶路时抬头看方向的人。你对趋势的嗅觉、对大局的把控、对目标的坚定,让你天然适合站在高处。有时候你会觉得孤单——那是因为别人还在半山腰讨论路边的花,你已经看见山那边的海了。',
26
+ cheers: '你的远见是一种稀缺资源。很多人一辈子都在走别人走过的路,而你即使走同样的路,也会找到更短的路径和更好的风景。你不需要降低自己的高度来合群——你合的是那些也愿意飞的人。你让身边的世界更清晰,这是无可替代的。',
27
+ perfectMatch: '战略会议上碾压全场的那个、朋友圈里总是第一个发现新机会的人、被同事称为"行走的望远镜"但你只是觉得别人看得太近',
28
+ advice: '飞得高很重要,但偶尔也需要低空掠过——看看地面上那些你忽略的人和事,那里也有值得你关注的风景。你的目标是星辰大海,但今天这顿饭也很重要。别忘了吃饭,你盘旋太久的时候没人敢提醒你。',
29
+ wildSurvivalSkill: '你的野生生存技能是"三千米视野"——当你还在讨论眼前得失的时候,你已经看见了三年后的版图。你从不受困于细节的迷宫,因为你的视角自带缩放功能:需要战术时俯冲,需要战略时升空。这是鹰的天赋:永远在正确的海拔上。',
30
+ idealHabitat: '一个能看到全景的高处、一个尊重你判断力的环境、以及一群不觉得你"想太多"而觉得你"想得对"的人。你需要天空的自由,但也需要一根偶尔能落脚的枯枝——哪怕只是歇歇翅膀。',
31
+ },
32
+ wolf: {
33
+ name: '狼',
34
+ emoji: '🐺',
35
+ desc: '你是忠诚的原始定义——不是盲目服从,是选择了之后就全力以赴。你不在意社交圈的广度,你在意的是那几个无论在雪夜还是晴天都愿意跟你并肩的人。你一个人的时候已经很能扛了,但你最发光的时候是在你的"狼群"里。',
36
+ cheers: '这个世界上懂"在一起"这三个字真正重量的人不多,你是其中一个。你的忠诚不是挂在嘴边的承诺,是你凌晨三点接电话的那个"嗯"、是你不问理由就出门的那个背影、是你站在朋友身后一言不发但谁也不敢再往前走的那一步。被你在意的人是幸运的,而你也值得同等的在意。',
37
+ perfectMatch: '深夜有事第一个被想起的人、从不轻易站队但一旦站了就绝不动摇的盟友、团队里看起来话最少但存在感最强的那个',
38
+ advice: '你对"自己人"太好了,有时候好到忘了自己。不是每一份付出都需要立刻回报,但你需要确认那些值得的人也在朝你跑来——而不是只有你在跑。孤独是你的力量,但不需要是你唯一的生活方式。狼有时候也会把脑袋搭在另一只狼的背上,这是信任,不是软弱。',
39
+ wildSurvivalSkill: '你的野生生存技能是"狼群召唤"——你不需要发微信、不需要群公告,只要一个眼神、一个侧头,那些真正懂你的人就知道你什么意思了。你们的默契不是训练出来的,是血液里流淌的。当你发出召唤的时候,来的人不是来帮忙的——他们是回家的。',
40
+ idealHabitat: '一个彼此信任的小团队、一份需要长期坚持的事业、以及能在深夜和狼群一起对着月亮嗷呜的勇气。你需要归属感胜过需要知名度,需要并肩胜过需要仰望。你的栖息地不大,但里面每一个位置都不可替换。',
41
+ },
42
+ cat: {
43
+ name: '猫',
44
+ emoji: '🐱',
45
+ desc: '你是独立的艺术家、慵懒的哲学家、自带美学的旁观者。你不急着融入人群,因为你知道真正值得的东西会自己走向你。你的优雅不是端着的,是骨子里的——你对品质和舒适有一种天然的判断力,从不凑合,从不将就。',
46
+ cheers: '你是那种"不需要任何人认可也活得很高级"的人。你的自洽是很多人的梦想——别人在社交媒体上经营人设,你窝在沙发上翻一本正好竖着拿的书,就已经赢了。你最迷人的地方是:你不需要谁,但你选择了一个人的时候,那个人就是全宇宙最特别的存在。',
47
+ perfectMatch: '独自旅行也能拍出电影感的人、朋友圈永远不发但每条都让人想看十遍的幕后美学大师、熟人面前完全换了一个物种的"假高冷真话痨"',
48
+ advice: '独立是一件很酷的事,但偶尔对重要的人露出肚皮,并不会破坏你的优雅人设——反而可能会让你更快乐。你不需要一直保持距离来证明自己的完整。猫也有呼噜声,而那个声音只有靠近你的人才能听到。让别人听一听吧。',
49
+ wildSurvivalSkill: '你的野生生存技能是"静默判断力"——当你走进一个房间,三秒钟之内就已经完成了对这里面所有人和事的评估,评分精确到小数点后一位。你不需要开口试探,因为你相信自己的直觉比大多数人的分析还准。你永远能在关键时刻做出最舒适的选择。',
50
+ idealHabitat: '一个有阳光的窗台、一份可以按自己节奏来的生活、以及几个不需要你解释"为什么不想出门"就能理解你的人。你需要空间、需要安静、需要美——你的栖息地是用品味和自在铺出来的,不欢迎噪音。',
51
+ },
52
+ rabbit: {
53
+ name: '兔子',
54
+ emoji: '🐰',
55
+ desc: '你是温和细腻的观察者,有一颗比棉花还柔软但比什么都坚韧的心。你看得到别人看不到的情绪褶皱,还记得住每一个人随口说过的一句"想吃那个"。你的温柔不是柔弱——温柔是你选择的力量,而你自己知道这份力量有多大。',
56
+ cheers: '你细腻到让人心疼的程度——你记得朋友的生日、记得上次聊天时对方说最近压力大、记得这个人喜欢什么口味的蛋糕。这个世界需要你这样的人,需要你这种把生活过得柔软而认真的方式。你让那些粗糙的日常变得精致温润,像是被包了一层绒布。',
57
+ perfectMatch: '生日提醒从来不需要App的人、微信聊天记录里搜"好吃"能出一家餐厅清单的行走美食地图、朋友嘴里"最治愈的人没有之一"',
58
+ advice: '你的温柔已经溢出了,有时候记得给自己也留一点。不是所有人的情绪垃圾都需要你来做回收站。你可以在自己也需要被照顾的时候说"我今天当不了你的树洞",这不是不温柔——这是对自己温柔。兔子急了也是会咬人的,而你的边界值得被尊重。',
59
+ wildSurvivalSkill: '你的野生生存技能是"360度安全感雷达"——你总能在一片陌生的环境里最先找到那个最安全、最舒服的角落,然后不动声色地把它变成一个温馨的小窝。你的直觉像兔耳朵一样灵敏,任何风吹草动都逃不过你的感知。危险来临时你不是跑得最快的,但你是第一个感知到的。',
60
+ idealHabitat: '一个安静温馨的小空间、一份不需要太多勾心斗角的工作、以及两三个能一起窝在沙发里各做各的事也不尴尬的人。你的栖息地不需要多大,但里面每一件物品都经过了你的精心挑选——从靠垫的颜色到窗台那盆薄荷的位置。',
61
+ },
62
+ fox: {
63
+ name: '狐狸',
64
+ emoji: '🦊',
65
+ desc: '你是聪明而灵活的生存艺术家——你的脑子转得比嘴快,应变速度比计划变更的速度还快。你总能在看似无路的地方找到一条小路,在别人放弃的时候嘿嘿一笑说"我试过了第三种方法"。你的机智不是算计,是你对世界保持好奇和幽默感的方式。',
66
+ cheers: '说实话,有你这样的人在身边生活简直像升级了游戏难度但给你配了一个外挂。你能在deadline之前五分钟创造出奇迹,能在最混乱的讨论里一句话点出问题核心,能在最无聊的日常里找到让人忍俊不禁的角度。你是那种"永远让人猜不到下一句"的有趣灵魂。',
67
+ perfectMatch: '危机处理永远第一人选、辩论赛隐藏boss、朋友里负责出馊主意但每次居然都能成功实施的那个鬼才',
68
+ advice: '聪明人最大的风险不是犯错,是太习惯用脑袋解决问题而忽略了身体的感觉。你偶尔也需要停下来,听听自己的心在说什么,而不是大脑在计算什么。不是每一件事都需要一个聪明的策略——有时候直接扑上去也是对的。狐狸的尾巴再蓬松,也得偶尔收起来当枕头睡一觉。',
69
+ wildSurvivalSkill: '你的野生生存技能是"狐狸闪现"——当你走进一个死胡同时,你从来不走回头路——你是直接翻过墙、另辟蹊径然后从另一条巷子里吹着口哨走出来的。你的大脑存储了一个巨大的"B计划数据库",而且奇怪的是,你的C计划和D计划也随时在更新中。你总能找到水源,哪怕在沙漠里。',
70
+ idealHabitat: '一个有变数和挑战的环境、一个尊重聪明头脑和快速反应的团队、以及一个可以随时"变形"的空间——今天你是策略官,明天你是创意总监,后天你只是在树洞里啃浆果的快乐狐狸。你需要可能性,你的栖息地必须留着一扇永远开着的后窗。',
71
+ },
72
+ bear: {
73
+ name: '熊',
74
+ emoji: '🐻',
75
+ desc: '你是大地本身——沉稳、厚重、可靠得让人想靠着你睡一觉。你不抢答、不抢镜、不抢功,但所有人都知道你是那个让一切稳稳运行的人。你的力量不是压迫性的,是包容性的:你用沉默的空间把身边的人保护好,让他们在你的领地里自由呼吸。',
76
+ cheers: '这个世界上的速度和喧嚣跟你没什么关系——你有你自己的步调,而这个步调才是对的。你知道什么是重要的、什么是可以等的,你做的每一个决定都经得起时间检验。你在的地方就有安全感,而安全感是这个世界上最被低估的奢侈品。你给出去的安稳,会以信任的形式加倍回来。',
77
+ perfectMatch: '灾难级的篝火晚会永远推荐召集人(因为你就是篝火本身)、朋友圈里唯一能让所有人同时闭嘴认真听的那一位、公司里那个"只要他/她在就不会崩"的精神支柱',
78
+ advice: '靠得住的人往往最容易被忽略——因为所有人都习惯了你扛着。你有权利说"这次我不管了",有权利躺平,有权利让别人也来照顾你。你不需要一直做所有人的靠山。熊要冬眠的,你没有亏欠谁。春天来的时候,你依然是最温暖的港湾。',
79
+ wildSurvivalSkill: '你的野生生存技能是"大地意志"——你的力量不是爆发型的,是持续型的。当别人已经在第一轮冲刺中耗尽精力时,你还稳稳地站着,连呼吸都没变。你对"节奏"有一种近乎神秘的把握:什么时候该前进、什么时候该等待、什么时候只是安静地举着一棵树等合适的人经过。没有人比你更懂"来得早不如来得巧"。',
80
+ idealHabitat: '一片需要耐心深耕的广阔森林、一个重视长期价值而非短期爆发的环境、以及一个足够大的树洞——能装下你全部的收藏、你的沉默和你想保护的所有人。你的栖息地不需要热闹,但需要厚度:每一样东西都有它的故事和重量。',
81
+ },
82
+ };
83
+ export function calculateResult(answers) {
84
+ const types = ['lion', 'dolphin', 'eagle', 'wolf', 'cat', 'rabbit', 'fox', 'bear'];
85
+ const scores = Object.fromEntries(types.map(t => [t, 0]));
86
+ // questionId 1-4=lion, 5-8=dolphin, 9-12=eagle, 13-16=wolf, 17-20=cat, 21-24=rabbit, 25-28=fox, 29-32=bear
87
+ for (const a of answers) {
88
+ const idx = a.questionId - 1;
89
+ const traitIdx = Math.floor(idx / 4);
90
+ const trait = types[traitIdx];
91
+ if (trait)
92
+ scores[trait] += a.score;
93
+ }
94
+ const sorted = Object.entries(scores).sort((a, b) => b[1] - a[1]);
95
+ const primary = sorted[0][0];
96
+ const profile = animalProfiles[primary];
97
+ const maxPossible = 4 * 5; // 4题 × 5分 = 20
98
+ return {
99
+ type: primary,
100
+ typeName: profile.name,
101
+ emoji: profile.emoji,
102
+ scores: Object.fromEntries(sorted.map(([k, v]) => [k, Math.round(v / maxPossible * 100)])),
103
+ description: profile.desc,
104
+ cheers: profile.cheers,
105
+ perfectMatch: profile.perfectMatch,
106
+ advice: profile.advice,
107
+ wildSurvivalSkill: profile.wildSurvivalSkill,
108
+ idealHabitat: profile.idealHabitat,
109
+ };
110
+ }
111
+ //# sourceMappingURL=calculator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculator.js","sourceRoot":"","sources":["../src/calculator.ts"],"names":[],"mappings":"AAaA,MAAM,cAAc,GAAkC;IACpD,IAAI,EAAE;QACJ,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,uGAAuG;QAC7G,MAAM,EAAE,sHAAsH;QAC9H,YAAY,EAAE,gDAAgD;QAC9D,MAAM,EAAE,qGAAqG;QAC7G,iBAAiB,EAAE,6FAA6F;QAChH,YAAY,EAAE,wFAAwF;KACvG;IACD,OAAO,EAAE;QACP,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,qGAAqG;QAC3G,MAAM,EAAE,yGAAyG;QACjH,YAAY,EAAE,4CAA4C;QAC1D,MAAM,EAAE,0FAA0F;QAClG,iBAAiB,EAAE,0GAA0G;QAC7H,YAAY,EAAE,mFAAmF;KAClG;IACD,KAAK,EAAE;QACL,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,iGAAiG;QACvG,MAAM,EAAE,wGAAwG;QAChH,YAAY,EAAE,yDAAyD;QACvE,MAAM,EAAE,2FAA2F;QACnG,iBAAiB,EAAE,yGAAyG;QAC5H,YAAY,EAAE,oFAAoF;KACnG;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,GAAG;QACT,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,sGAAsG;QAC5G,MAAM,EAAE,8HAA8H;QACtI,YAAY,EAAE,qDAAqD;QACnE,MAAM,EAAE,sHAAsH;QAC9H,iBAAiB,EAAE,iHAAiH;QACpI,YAAY,EAAE,6FAA6F;KAC5G;IACD,GAAG,EAAE;QACH,IAAI,EAAE,GAAG;QACT,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,mGAAmG;QACzG,MAAM,EAAE,oHAAoH;QAC5H,YAAY,EAAE,8DAA8D;QAC5E,MAAM,EAAE,oGAAoG;QAC5G,iBAAiB,EAAE,iHAAiH;QACpI,YAAY,EAAE,2FAA2F;KAC1G;IACD,MAAM,EAAE;QACN,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,uGAAuG;QAC7G,MAAM,EAAE,gHAAgH;QACxH,YAAY,EAAE,4DAA4D;QAC1E,MAAM,EAAE,gHAAgH;QACxH,iBAAiB,EAAE,6HAA6H;QAChJ,YAAY,EAAE,qGAAqG;KACpH;IACD,GAAG,EAAE;QACH,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,+GAA+G;QACrH,MAAM,EAAE,yHAAyH;QACjI,YAAY,EAAE,gDAAgD;QAC9D,MAAM,EAAE,0HAA0H;QAClI,iBAAiB,EAAE,kIAAkI;QACrJ,YAAY,EAAE,6GAA6G;KAC5H;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,GAAG;QACT,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,8GAA8G;QACpH,MAAM,EAAE,8HAA8H;QACtI,YAAY,EAAE,0EAA0E;QACxF,MAAM,EAAE,2GAA2G;QACnH,iBAAiB,EAAE,8IAA8I;QACjK,YAAY,EAAE,sGAAsG;KACrH;CACF,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,OAAiB;IAC/C,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACnF,MAAM,MAAM,GAA2B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAElF,2GAA2G;IAC3G,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9B,IAAI,KAAK;YAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;IACtC,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAExC,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe;IAE1C,OAAO;QACL,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,OAAO,CAAC,IAAI;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1F,WAAW,EAAE,OAAO,CAAC,IAAI;QACzB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,YAAY,EAAE,OAAO,CAAC,YAAY;KACnC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Animal Personality MCP Server — 动物系人格测试
4
+ * 32道幽默题目 · 8种动物人格 · 情绪价值拉满的报告
5
+ *
6
+ * 用法: npx -y animal-personality-mcp
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
package/dist/index.js ADDED
@@ -0,0 +1,219 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Animal Personality MCP Server — 动物系人格测试
4
+ * 32道幽默题目 · 8种动物人格 · 情绪价值拉满的报告
5
+ *
6
+ * 用法: npx -y animal-personality-mcp
7
+ */
8
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
9
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
10
+ import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
11
+ import { questions } from './questions.js';
12
+ import { calculateResult } from './calculator.js';
13
+ const server = new Server({ name: 'animal-personality-mcp-server', version: '1.0.0' }, { capabilities: { tools: {} } });
14
+ // ==================== List tools ====================
15
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
16
+ tools: [
17
+ {
18
+ name: 'start_animal_test',
19
+ description: `开始动物系人格测试!一共${questions.length}道趣味题目,看看你的灵魂里住着哪种动物。每道题回答 1-5 分,放轻松像在做游戏。`,
20
+ inputSchema: {
21
+ type: 'object',
22
+ properties: {},
23
+ required: [],
24
+ },
25
+ },
26
+ {
27
+ name: 'answer_question',
28
+ description: '提交当前问题的答案(1-5分),获取下一题或最终结果提示。',
29
+ inputSchema: {
30
+ type: 'object',
31
+ properties: {
32
+ session: {
33
+ type: 'object',
34
+ description: '测试会话状态',
35
+ properties: {
36
+ answers: { type: 'array', items: { type: 'object', properties: { questionId: { type: 'number' }, score: { type: 'number' } } } },
37
+ currentQuestionIndex: { type: 'number' },
38
+ },
39
+ required: ['answers', 'currentQuestionIndex'],
40
+ },
41
+ score: {
42
+ type: 'number',
43
+ description: '1=完全不像我, 2=不太像我, 3=有时候像, 4=挺像我的, 5=这就是我本人!',
44
+ minimum: 1,
45
+ maximum: 5,
46
+ },
47
+ },
48
+ required: ['session', 'score'],
49
+ },
50
+ },
51
+ {
52
+ name: 'get_progress',
53
+ description: '看看你做了多少题了,还差几题就能揭开你的动物人格面纱。',
54
+ inputSchema: {
55
+ type: 'object',
56
+ properties: {
57
+ session: {
58
+ type: 'object',
59
+ properties: {
60
+ answers: { type: 'array' },
61
+ currentQuestionIndex: { type: 'number' },
62
+ },
63
+ required: ['answers', 'currentQuestionIndex'],
64
+ },
65
+ },
66
+ required: ['session'],
67
+ },
68
+ },
69
+ {
70
+ name: 'calculate_animal_result',
71
+ description: `做完所有${questions.length}题后,获取你的动物人格报告!包含人格描述、专属 cheers、最适合你的场景/角色、野生生存技能、最适合你的栖息地,还有一条温柔的陪伴建议。`,
72
+ inputSchema: {
73
+ type: 'object',
74
+ properties: {
75
+ session: {
76
+ type: 'object',
77
+ properties: {
78
+ answers: { type: 'array' },
79
+ currentQuestionIndex: { type: 'number' },
80
+ },
81
+ required: ['answers', 'currentQuestionIndex'],
82
+ },
83
+ },
84
+ required: ['session'],
85
+ },
86
+ },
87
+ ],
88
+ }));
89
+ // ==================== Call tool ====================
90
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
91
+ const { name, arguments: args } = request.params;
92
+ try {
93
+ // --- start_animal_test ---
94
+ if (name === 'start_animal_test') {
95
+ const session = { answers: [], currentQuestionIndex: 0 };
96
+ return {
97
+ content: [{ type: 'text', text: JSON.stringify({
98
+ message: `🌿 动物系人格测试开始啦!一共 ${questions.length} 题,放轻松,没有对错,只有你灵魂里住着的那只动物在等你——`,
99
+ aboutTheTest: '每道题请根据你的第一反应打分:1=完全不像我 · 5=这就是我本人!',
100
+ currentQuestion: {
101
+ index: 1,
102
+ total: questions.length,
103
+ question: questions[0],
104
+ },
105
+ session,
106
+ }, null, 2) }],
107
+ };
108
+ }
109
+ // --- answer_question ---
110
+ if (name === 'answer_question') {
111
+ const session = (args?.session ?? { answers: [], currentQuestionIndex: 0 });
112
+ const score = Number(args?.score ?? 3);
113
+ const currentQ = questions[session.currentQuestionIndex];
114
+ const updatedSession = {
115
+ ...session,
116
+ answers: [...session.answers, { questionId: currentQ.id, score }],
117
+ currentQuestionIndex: session.currentQuestionIndex + 1,
118
+ };
119
+ // 完成了吗
120
+ if (updatedSession.currentQuestionIndex >= questions.length) {
121
+ return {
122
+ content: [{ type: 'text', text: JSON.stringify({
123
+ message: `所有 ${questions.length} 道题都答完了!你太棒了!现在只剩最后一步~`,
124
+ completed: true,
125
+ progress: { answered: updatedSession.answers.length, total: questions.length },
126
+ session: updatedSession,
127
+ nextStep: '快来用 calculate_animal_result 看看你灵魂里住着哪种动物吧!',
128
+ }, null, 2) }],
129
+ };
130
+ }
131
+ // 中间鼓励
132
+ const nextQ = questions[updatedSession.currentQuestionIndex];
133
+ const progressPct = Math.round(updatedSession.currentQuestionIndex / questions.length * 100);
134
+ const encouragement = progressPct < 30 ? '开局不错!你的动物已经在远处探头观察你了~' :
135
+ progressPct < 60 ? '越来越有意思了,我隐约感觉到你的动物正在朝你走来……' :
136
+ progressPct < 90 ? '快做完啦!你的动物人格已经在你背后踱步了~' :
137
+ '最后几题了!答案即将揭晓,你的动物已经迫不及待想跟你相认了!';
138
+ return {
139
+ content: [{ type: 'text', text: JSON.stringify({
140
+ message: encouragement,
141
+ progress: {
142
+ answered: updatedSession.answers.length,
143
+ total: questions.length,
144
+ percentage: Math.round(updatedSession.answers.length / questions.length * 100),
145
+ },
146
+ nextQuestion: {
147
+ index: updatedSession.currentQuestionIndex + 1,
148
+ total: questions.length,
149
+ question: nextQ,
150
+ },
151
+ session: updatedSession,
152
+ }, null, 2) }],
153
+ };
154
+ }
155
+ // --- get_progress ---
156
+ if (name === 'get_progress') {
157
+ const session = (args?.session ?? { answers: [], currentQuestionIndex: 0 });
158
+ const answered = session.answers?.length ?? 0;
159
+ const pct = Math.round(answered / questions.length * 100);
160
+ return {
161
+ content: [{ type: 'text', text: JSON.stringify({
162
+ answered,
163
+ total: questions.length,
164
+ percentage: pct,
165
+ remaining: questions.length - answered,
166
+ vibes: pct === 0 ? '还没开始呢,输入 start_animal_test 来探索你的动物人格吧!' :
167
+ pct === 100 ? '所有题目都答完啦!去用 calculate_animal_result 揭晓答案吧~' :
168
+ `你已经完成了 ${pct}%,还剩 ${questions.length - answered} 题,你的动物在等你~`,
169
+ }, null, 2) }],
170
+ };
171
+ }
172
+ // --- calculate_animal_result ---
173
+ if (name === 'calculate_animal_result') {
174
+ const session = (args?.session ?? { answers: [], currentQuestionIndex: 0 });
175
+ if (!session.answers || session.answers.length < questions.length) {
176
+ return {
177
+ content: [{ type: 'text', text: JSON.stringify({
178
+ error: '还没做完呢~再回答几题就可以揭晓你的动物人格啦!',
179
+ progress: { answered: session.answers?.length ?? 0, total: questions.length },
180
+ }, null, 2) }], isError: true,
181
+ };
182
+ }
183
+ const result = calculateResult(session.answers);
184
+ return {
185
+ content: [{ type: 'text', text: JSON.stringify({
186
+ message: '🌿 你的动物人格报告已生成!',
187
+ yourAnimal: {
188
+ type: result.type,
189
+ name: result.typeName,
190
+ emoji: result.emoji,
191
+ description: result.description,
192
+ },
193
+ scores: result.scores,
194
+ cheers: result.cheers,
195
+ perfectMatch: result.perfectMatch,
196
+ wildSurvivalSkill: result.wildSurvivalSkill,
197
+ idealHabitat: result.idealHabitat,
198
+ advice: result.advice,
199
+ finalThought: '每一种动物都有自己独特的美,人也一样。你不是"不够好",你只是还没遇到懂你所属物种的人。谢谢你来做这个测试,你的灵魂动物已经正式认领你啦——请好好照顾它。',
200
+ }, null, 2) }],
201
+ };
202
+ }
203
+ return { content: [{ type: 'text', text: JSON.stringify({ error: '未知工具' }) }], isError: true };
204
+ }
205
+ catch (error) {
206
+ return {
207
+ content: [{ type: 'text', text: JSON.stringify({ error: error instanceof Error ? error.message : '未知错误' }) }],
208
+ isError: true,
209
+ };
210
+ }
211
+ });
212
+ // ==================== 启动 ====================
213
+ async function main() {
214
+ const transport = new StdioServerTransport();
215
+ await server.connect(transport);
216
+ console.error('🌿 Animal Personality MCP Server running on stdio');
217
+ }
218
+ main().catch((error) => { console.error('Server error:', error); process.exit(1); });
219
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Question } from './types.js';
2
+ export declare const questions: Question[];
3
+ //# sourceMappingURL=questions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"questions.d.ts","sourceRoot":"","sources":["../src/questions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,eAAO,MAAM,SAAS,EAAE,QAAQ,EAgD/B,CAAC"}
@@ -0,0 +1,44 @@
1
+ // 8种动物 × 4题 = 32题
2
+ export const questions = [
3
+ // ========== 狮子 Lion ==========
4
+ { id: 1, text: '在群体里你经常还没反应过来就被推选成了做决定的那个人,好像你天生就长了一张"听我的准没错"的脸。', trait: 'lion', emoji: '🦁' },
5
+ { id: 2, text: '你走在路上气场自动扩散两米,不是故意的——是路人自动给你让道的那种,连小区流浪猫见了你都主动蹭过来。', trait: 'lion', emoji: '🦁' },
6
+ { id: 3, text: '朋友遇到麻烦你第一反应不是安慰,是已经在脑子里拉好了作战地图和三个备选方案,嘴上说"别慌"的同时已经在行动了。', trait: 'lion', emoji: '🦁' },
7
+ { id: 4, text: '你有一种让人"惹不起但很想靠近"的奇妙魅力——怕你三分,敬你七分,最后全变成了依赖。', trait: 'lion', emoji: '🦁' },
8
+ // ========== 海豚 Dolphin ==========
9
+ { id: 5, text: '你有一种能力:走到哪里都能把一群不太熟的人变成一个小团队,而且全程只有你在认真记住每个人的名字。', trait: 'dolphin', emoji: '🐬' },
10
+ { id: 6, text: '你说话的时候别人会不自觉地笑,不是因为你在讲笑话,而是你的声波自带快乐频率——你大概是从海底某个自带BGM的地方来的。', trait: 'dolphin', emoji: '🐬' },
11
+ { id: 7, text: '你善于在别人的话里听到他们自己都没说出来的需求,然后悄悄递上帮助,别人惊喜得以为你会读心术。', trait: 'dolphin', emoji: '🐬' },
12
+ { id: 8, text: '你处理尴尬场面的能力堪称艺术——再冷的气氛你也能一个翻身跳进去把它搅热,然后若无其事地游走。', trait: 'dolphin', emoji: '🐬' },
13
+ // ========== 老鹰 Eagle ==========
14
+ { id: 9, text: '你思考问题的时候其他人还在纠结眼前的花草,你已经飞到三千米高空看见整片森林的轮廓了——然后精准指出哪里有果子。', trait: 'eagle', emoji: '🦅' },
15
+ { id: 10, text: '你很少参与办公室八卦,不是高冷,是你真的在想五年之后的事情,而八卦的有效期只有半天。', trait: 'eagle', emoji: '🦅' },
16
+ { id: 11, text: '你做决定的时候别人觉得你太快,但其实你在脑子里已经盘旋观察了很久——你的犹豫不在嘴上,在眼睛扫过每一个细节的那几秒。', trait: 'eagle', emoji: '🦅' },
17
+ { id: 12, text: '你的人生规划像一只鹰的飞行路线:看似随意盘旋,其实每一个弯都是奔着上升气流去的。', trait: 'eagle', emoji: '🦅' },
18
+ // ========== 狼 Wolf ==========
19
+ { id: 13, text: '你认定的朋友就是一辈子的事——不是嘴上说的那种"我们是兄弟",是真的在对方需要的时候你已经在打车了。', trait: 'wolf', emoji: '🐺' },
20
+ { id: 14, text: '你一个人可以扛下很多事,但你更享受和一群信得过的人一起朝着同一个方向跑——团队对你来说不是工具,是另一个自己。', trait: 'wolf', emoji: '🐺' },
21
+ { id: 15, text: '你对"背叛"这两个字有生理性的过敏反应,一旦信任被辜负你会沉默地走开,不会再给第二次机会——但你也从不会去报复。', trait: 'wolf', emoji: '🐺' },
22
+ { id: 16, text: '你在人群中话不多,但一旦开口通常都是关键的那一句——你就像团队的脊椎骨,不露面但撑住了所有。', trait: 'wolf', emoji: '🐺' },
23
+ // ========== 猫 Cat ==========
24
+ { id: 17, text: '你对社交的态度是:我可以跟你玩,但玩多久、什么时候结束、要不要理你,由我来决定。', trait: 'cat', emoji: '🐱' },
25
+ { id: 18, text: '你享受独处到了一种让人羡慕的境界——一个人吃饭、逛街、看电影不仅不觉得惨,还觉得自己终于有时间精致地浪费时间了。', trait: 'cat', emoji: '🐱' },
26
+ { id: 19, text: '你走进一个房间不是走进来的,是"S"形曲线优雅踱入的——哪怕只是在找遥控器,你的动作都自带一种慵懒的韵律。', trait: 'cat', emoji: '🐱' },
27
+ { id: 20, text: '你不轻易对人展现柔软的一面,但如果有一天你主动把头靠在了某人肩上——那个人一定是上辈子拯救过银河系。', trait: 'cat', emoji: '🐱' },
28
+ // ========== 兔子 Rabbit ==========
29
+ { id: 21, text: '你的敏感不是弱点,是你接收到世界信号的天线比别人多了三根——连别人嘴角动了0.3毫米你都能捕捉到。', trait: 'rabbit', emoji: '🐰' },
30
+ { id: 22, text: '你不喜欢冲突到了惊人的程度——明明是对方的问题,你已经在心里帮对方找好了三个合理的借口。', trait: 'rabbit', emoji: '🐰' },
31
+ { id: 23, text: '你对"家"的执念比你以为的更深——你精心挑选的香薰、那条用了三年舍不得换的小毯子、阳台上被照顾得很好的绿植,都是你在给世界画一个小而美的结界。', trait: 'rabbit', emoji: '🐰' },
32
+ { id: 24, text: '你安静的时候别人以为你在发呆,其实你的内心正在举办一场细腻的感情交响乐——每一个音符都是你对身边人的在意。', trait: 'rabbit', emoji: '🐰' },
33
+ // ========== 狐狸 Fox ==========
34
+ { id: 25, text: '你有一种让人"明明知道你在绕弯子但还是心甘情愿跟着你走"的奇妙说服力——你从不强迫,你只是让正确答案自己站起来走到对方面前。', trait: 'fox', emoji: '🦊' },
35
+ { id: 26, text: '你遇到困难的第一反应不是慌,是脑子里弹出一个弹窗:"有趣,这个之前没遇到过,让我研究一下漏洞在哪。"', trait: 'fox', emoji: '🦊' },
36
+ { id: 27, text: '你总能在别人还在讨论"A好还是B好"的时候找到第三个选项C——而且C往往比A和B加起来还聪明。', trait: 'fox', emoji: '🦊' },
37
+ { id: 28, text: '你的幽默感像狐狸的尾巴——蓬松、灵活、总在意想不到的时候扫过别人的笑点,让他们笑得措手不及。', trait: 'fox', emoji: '🦊' },
38
+ // ========== 熊 Bear ==========
39
+ { id: 29, text: '你在朋友圈里的外号大概率是"爸爸"或"妈妈"——不是因为年龄大,是因为你自带一种"出了事找你就对了"的沉稳气场。', trait: 'bear', emoji: '🐻' },
40
+ { id: 30, text: '你的存在本身就是一种安全感——不自带背景音乐也不带特效,但你站在那里,大家就觉得天塌下来也有个能扛的人。', trait: 'bear', emoji: '🐻' },
41
+ { id: 31, text: '你不轻易承诺,但一旦说了"交给我"三个字,这三个字比你见过的任何合同都更有约束力。', trait: 'bear', emoji: '🐻' },
42
+ { id: 32, text: '你生气的时候不说话不是因为妥协,是因为你清楚自己的爪子有多重——你选择先让自己冷静下来而不是伤人。', trait: 'bear', emoji: '🐻' },
43
+ ];
44
+ //# sourceMappingURL=questions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"questions.js","sourceRoot":"","sources":["../src/questions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export interface Question {
2
+ id: number;
3
+ text: string;
4
+ trait: string;
5
+ emoji?: string;
6
+ }
7
+ export interface Answer {
8
+ questionId: number;
9
+ score: number;
10
+ }
11
+ export interface TestSession {
12
+ testType: string;
13
+ answers: Answer[];
14
+ currentQuestionIndex: number;
15
+ }
16
+ export interface TestResult {
17
+ type: string;
18
+ typeName: string;
19
+ emoji: string;
20
+ scores: Record<string, number>;
21
+ description: string;
22
+ cheers: string;
23
+ perfectMatch: string;
24
+ advice: string;
25
+ wildSurvivalSkill: string;
26
+ idealHabitat: string;
27
+ }
28
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,MAAM;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;CACtB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "animal-personality-mcp",
3
+ "version": "1.0.0",
4
+ "description": "动物系人格测试 MCP Server — 你是哪种动物?32道幽默题目,情绪价值拉满的人格报告",
5
+ "type": "module",
6
+ "bin": "./dist/index.js",
7
+ "files": ["dist", "README.md"],
8
+ "scripts": {
9
+ "build": "tsc",
10
+ "start": "node dist/index.js",
11
+ "dev": "tsx src/index.ts",
12
+ "prepublishOnly": "npm run build"
13
+ },
14
+ "keywords": ["mcp", "animal", "personality", "fun", "cute"],
15
+ "license": "MIT",
16
+ "dependencies": { "@modelcontextprotocol/sdk": "^1.0.4" },
17
+ "devDependencies": { "@types/node": "^22.10.2", "tsx": "^4.0.0", "typescript": "^5.7.2" },
18
+ "engines": { "node": ">=18.0.0" }
19
+ }