{"_id":"@ainote/mcp","_rev":"10-c134bea5c5b219721d1d945af6d8cc47","name":"@ainote/mcp","dist-tags":{"latest":"1.3.2"},"versions":{"1.0.0":{"name":"@ainote/mcp","version":"1.0.0","keywords":["mcp","modelcontextprotocol","model-context-protocol","claude","claude-desktop","ainote","ai-note","tasks","task-management","todo","productivity","api","integration"],"author":{"name":"AI Note Team","email":"support@ainote.app"},"license":"MIT","_id":"@ainote/mcp@1.0.0","maintainers":[{"name":"beast2025","email":"theqwe2000@gmail.com"}],"homepage":"https://github.com/ainote-dev/ainote-mcp#readme","bugs":{"url":"https://github.com/ainote-dev/ainote-mcp/issues"},"bin":{"ainote-mcp":"index.js"},"dist":{"shasum":"604c6accab8461422b9975c50114f6da443ea1e7","tarball":"https://registry.npmjs.org/@ainote/mcp/-/mcp-1.0.0.tgz","fileCount":5,"integrity":"sha512-/7H3N0vt8qjg2afbsaBFvpDzTQ4o3IRJBVBLT8HuJHB8P7JER8pwPwhgK8/gtjmoOvfZQqMk1FRXXOU3ziCkAw==","signatures":[{"sig":"MEYCIQDmgYbmu8kOYJj3fz0z2l+KE/DYuqsU6o5e+EQXCyqzCQIhAKJ5X/2en0CAQPT04r5w2JGoX7swMqh7kbn6ngJO1gJT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22779},"main":"index.js","type":"module","engines":{"node":">=16.0.0"},"gitHead":"2c1fb44e16d26ea210e0cc3082fabc0e3dbd7053","scripts":{"test":"echo \"Error: no test specified\" && exit 1","start":"node index.js"},"_npmUser":{"name":"beast2025","email":"theqwe2000@gmail.com"},"repository":{"url":"git+https://github.com/ainote-dev/ainote-mcp.git","type":"git"},"_npmVersion":"10.9.2","description":"MCP server for AI Note - Connect Claude Desktop to your AI Note tasks","directories":{},"_nodeVersion":"22.14.0","dependencies":{"axios":"^1.6.0","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/mcp_1.0.0_1752975980669_0.17293736870804066","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@ainote/mcp","version":"1.0.1","keywords":["mcp","modelcontextprotocol","model-context-protocol","claude","claude-desktop","ainote","ai-note","tasks","task-management","todo","productivity","api","integration"],"author":{"name":"AI Note Team","email":"support@ainote.app"},"license":"MIT","_id":"@ainote/mcp@1.0.1","maintainers":[{"name":"beast2025","email":"theqwe2000@gmail.com"}],"homepage":"https://github.com/ainote-dev/ainote-mcp#readme","bugs":{"url":"https://github.com/ainote-dev/ainote-mcp/issues"},"bin":{"ainote-mcp":"index.js"},"dist":{"shasum":"4b7ce602143485a694887dbd45c267e06e126aeb","tarball":"https://registry.npmjs.org/@ainote/mcp/-/mcp-1.0.1.tgz","fileCount":5,"integrity":"sha512-8JFRirnwgGaTtmxxbAf88UykFIp+5alBH7lcTL+feNk7jqIcoIDRi5HiaD+IzRv7/Rk0mIDdvi2s3cV7FNkBug==","signatures":[{"sig":"MEQCIB8LQ4u5shxXKlfYCPMibBAVPc1JNSuj7sihjCPvTcsgAiBdnqifZjb9KUrw4nNAS1qolwW4lonz3uQoNX1mGlg9zQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":27009},"main":"index.js","type":"module","engines":{"node":">=16.0.0"},"gitHead":"f63207d812d6769e2e6a990dd2baf9ea898270ad","scripts":{"test":"echo \"Error: no test specified\" && exit 1","start":"node index.js"},"_npmUser":{"name":"beast2025","email":"theqwe2000@gmail.com"},"repository":{"url":"git+https://github.com/ainote-dev/ainote-mcp.git","type":"git"},"_npmVersion":"10.9.2","description":"MCP server for AI Note - Connect Claude Desktop to your AI Note tasks","directories":{},"_nodeVersion":"22.14.0","dependencies":{"axios":"^1.6.0","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/mcp_1.0.1_1753020979725_0.5225279814671635","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@ainote/mcp","version":"1.0.2","keywords":["mcp","modelcontextprotocol","model-context-protocol","claude","claude-desktop","ainote","ai-note","tasks","task-management","todo","productivity","api","integration"],"author":{"name":"AI Note Team","email":"support@ainote.app"},"license":"MIT","_id":"@ainote/mcp@1.0.2","maintainers":[{"name":"beast2025","email":"theqwe2000@gmail.com"}],"homepage":"https://github.com/ainote-dev/ainote-mcp#readme","bugs":{"url":"https://github.com/ainote-dev/ainote-mcp/issues"},"bin":{"ainote-mcp":"index.js"},"dist":{"shasum":"21dc68666a33ff9dd35f30659e2fa43422e3b227","tarball":"https://registry.npmjs.org/@ainote/mcp/-/mcp-1.0.2.tgz","fileCount":5,"integrity":"sha512-JQxHTbwV3cKW/QbKE7tyWE0nV9dwbNs368cLRHHrUNL8+cpvBlu1kIl5TNRmWLEIKNvVkdSdUjzzE/SNLYAUHw==","signatures":[{"sig":"MEUCIDHZGmWfesy8iJIE0EIDz9rCon/uaYc1RF430tIpifJOAiEAtJN8ghr1Q/twa16/dR04y9aDXI69f5jrQFDi2pi/WXM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":27970},"main":"index.js","type":"module","engines":{"node":">=16.0.0"},"gitHead":"aa6fbc6b4d90c33ded29b92bf9353376de2897fb","scripts":{"test":"echo \"Error: no test specified\" && exit 1","start":"node index.js"},"_npmUser":{"name":"beast2025","email":"theqwe2000@gmail.com"},"repository":{"url":"git+https://github.com/ainote-dev/ainote-mcp.git","type":"git"},"_npmVersion":"10.9.2","description":"MCP server for AI Note - Connect Claude Desktop to your AI Note tasks","directories":{},"_nodeVersion":"22.14.0","dependencies":{"axios":"^1.6.0","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/mcp_1.0.2_1754040475031_0.7333260875148906","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@ainote/mcp","version":"1.0.3","keywords":["mcp","modelcontextprotocol","model-context-protocol","claude","claude-desktop","ainote","ai-note","tasks","task-management","todo","productivity","api","integration"],"author":{"name":"AI Note Team","email":"support@ainote.app"},"license":"MIT","_id":"@ainote/mcp@1.0.3","maintainers":[{"name":"beast2025","email":"theqwe2000@gmail.com"}],"homepage":"https://github.com/ainote-dev/ainote-mcp#readme","bugs":{"url":"https://github.com/ainote-dev/ainote-mcp/issues"},"bin":{"ainote-mcp":"index.js","ainote-mcp-http":"server.js"},"dist":{"shasum":"0253b11c54c294de75f0efd9ecd7f425a8733309","tarball":"https://registry.npmjs.org/@ainote/mcp/-/mcp-1.0.3.tgz","fileCount":20,"integrity":"sha512-/h17I1jf/LSmzXzg2PzJDsYMmWiiKICBH1AFV8JKQjcD6sS8WLb7TNlpN3YegO7GVPePZf8dzrZp04W1/esh6Q==","signatures":[{"sig":"MEUCIQDoc3KE5P/sJBeeLRStOq+etKdhuAviDJZSBPSRvgCRNAIgB0ff74xNhVUYF9zhUlfW67PaX284f6KEoTIfVqTBgP8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46211},"jest":{"testMatch":["**/__tests__/**/*.test.js","**/?(*.)+(spec|test).js"],"transform":{},"testEnvironment":"node","coverageDirectory":"coverage","coverageReporters":["text","lcov","html"],"collectCoverageFrom":["index.js","server.js","lib/**/*.js","!node_modules/**"]},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"076f983e44d89a71898ef117272f06305e225bf8","scripts":{"test":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest","start":"node index.js","start:http":"node server.js","test:watch":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --watch","test:verbose":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --verbose","test:coverage":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --coverage"},"_npmUser":{"name":"beast2025","email":"theqwe2000@gmail.com"},"repository":{"url":"git+https://github.com/ainote-dev/ainote-mcp.git","type":"git"},"_npmVersion":"10.9.2","description":"MCP server for AI Note - Connect Claude Desktop to your AI Note tasks","directories":{},"_nodeVersion":"22.14.0","dependencies":{"cors":"^2.8.5","axios":"^1.6.0","morgan":"^1.10.0","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","@jest/globals":"^29.7.0","axios-mock-adapter":"^1.22.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_1.0.3_1761558172914_0.4289200172118721","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@ainote/mcp","version":"1.1.0","keywords":["mcp","modelcontextprotocol","model-context-protocol","claude","claude-code","claude-desktop","cursor","windsurf","copilot","ainote","ai-note","dev-docs","claude-md","memory","tasks","task-management","todo","productivity","api","integration"],"author":{"name":"AI Note Team","email":"support@ainote.app"},"license":"MIT","_id":"@ainote/mcp@1.1.0","maintainers":[{"name":"beast2025","email":"theqwe2000@gmail.com"}],"homepage":"https://github.com/ainote-dev/ainote-mcp#readme","bugs":{"url":"https://github.com/ainote-dev/ainote-mcp/issues"},"bin":{"ainote-mcp":"index.js","ainote-mcp-http":"server.js"},"dist":{"shasum":"db7f6ed58e7e06e8f7b411ecc4342f8a08d01ee3","tarball":"https://registry.npmjs.org/@ainote/mcp/-/mcp-1.1.0.tgz","fileCount":23,"integrity":"sha512-+g0p5moBarwIFuBpkN+eXKFKhFiITxPfT6YIYDXADukRLo7vaasIAyXUjONpHAJcWT4V8oW+n2NWD9O1OeAvjQ==","signatures":[{"sig":"MEUCIDZ1/vk/i/KOpqOO3/wpd8/ysJxMcIDU90lGf1XHnJk9AiEA3CWV+H6xJZNdYcad/lRbaPSC+t0VnXqNH/HzHCBlGVc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":70669},"jest":{"testMatch":["**/__tests__/**/*.test.js","**/?(*.)+(spec|test).js"],"transform":{},"testEnvironment":"node","coverageDirectory":"coverage","coverageReporters":["text","lcov","html"],"collectCoverageFrom":["index.js","server.js","lib/**/*.js","!node_modules/**"]},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"d547c6bd3797db0b72da773b8bc8b27b3e3f0fae","scripts":{"test":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest","start":"node index.js","start:http":"node server.js","test:watch":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --watch","test:verbose":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --verbose","test:coverage":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --coverage"},"_npmUser":{"name":"beast2025","email":"theqwe2000@gmail.com"},"repository":{"url":"git+https://github.com/ainote-dev/ainote-mcp.git","type":"git"},"_npmVersion":"10.9.2","description":"MCP server for AI Note - Tasks + Dev Docs (CLAUDE.md, Cursor rules, Windsurf rules) management via MCP","directories":{},"_nodeVersion":"22.14.0","dependencies":{"cors":"^2.8.5","axios":"^1.6.0","morgan":"^1.10.0","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","@jest/globals":"^29.7.0","axios-mock-adapter":"^1.22.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_1.1.0_1772618072990_0.8547167403918625","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@ainote/mcp","version":"1.1.1","keywords":["mcp","modelcontextprotocol","model-context-protocol","claude","claude-code","claude-desktop","cursor","windsurf","copilot","ainote","ai-note","dev-docs","claude-md","memory","tasks","task-management","todo","productivity","api","integration"],"author":{"name":"AI Note Team","email":"support@ainote.app"},"license":"MIT","_id":"@ainote/mcp@1.1.1","maintainers":[{"name":"beast2025","email":"theqwe2000@gmail.com"}],"homepage":"https://github.com/ainote-dev/ainote-mcp#readme","bugs":{"url":"https://github.com/ainote-dev/ainote-mcp/issues"},"bin":{"ainote-mcp":"index.js","ainote-mcp-http":"server.js"},"dist":{"shasum":"c70394f4ae65f02bb17999494f3a9dd9c7d69d7c","tarball":"https://registry.npmjs.org/@ainote/mcp/-/mcp-1.1.1.tgz","fileCount":23,"integrity":"sha512-x1UB0S8QnbJRCtz6eDaSTGJPErTRlOat24OhAK7CKCHB3CxwLvsxSam1qXGM+R9LfTtRkRH3UD06ctY7dZJrkQ==","signatures":[{"sig":"MEYCIQDO8S2CttvWOpkYfuBqt9XiRH/nB8m0u311l8pAen3nXwIhAPuBp5REjRe92DJpzSFBpqgDLDwKWIlOlpDey8LwAgkj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":73754},"jest":{"testMatch":["**/__tests__/**/*.test.js","**/?(*.)+(spec|test).js"],"transform":{},"testEnvironment":"node","coverageDirectory":"coverage","coverageReporters":["text","lcov","html"],"collectCoverageFrom":["index.js","server.js","lib/**/*.js","!node_modules/**"]},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"d547c6bd3797db0b72da773b8bc8b27b3e3f0fae","scripts":{"test":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest","start":"node index.js","start:http":"node server.js","test:watch":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --watch","test:verbose":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --verbose","test:coverage":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --coverage"},"_npmUser":{"name":"beast2025","email":"theqwe2000@gmail.com"},"repository":{"url":"git+https://github.com/ainote-dev/ainote-mcp.git","type":"git"},"_npmVersion":"10.9.2","description":"MCP server for AI Note - Tasks, Dev Docs, and multi-device file sync (CLAUDE.md, memory files, Cursor rules, Windsurf rules)","directories":{},"_nodeVersion":"22.14.0","dependencies":{"cors":"^2.8.5","axios":"^1.6.0","morgan":"^1.10.0","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","@jest/globals":"^29.7.0","axios-mock-adapter":"^1.22.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_1.1.1_1772621287162_0.09927258781400705","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@ainote/mcp","version":"1.2.0","keywords":["mcp","modelcontextprotocol","model-context-protocol","claude","claude-code","claude-desktop","cursor","windsurf","copilot","ainote","ai-note","dev-docs","claude-md","memory","tasks","task-management","todo","productivity","api","integration"],"author":{"name":"AI Note Team","email":"support@ainote.app"},"license":"MIT","_id":"@ainote/mcp@1.2.0","maintainers":[{"name":"beast2025","email":"theqwe2000@gmail.com"}],"homepage":"https://github.com/ainote-dev/ainote-mcp#readme","bugs":{"url":"https://github.com/ainote-dev/ainote-mcp/issues"},"bin":{"ainote-mcp":"index.js","ainote-mcp-http":"server.js"},"dist":{"shasum":"1e431f08d73e4bb385a853faae1b296b856cf221","tarball":"https://registry.npmjs.org/@ainote/mcp/-/mcp-1.2.0.tgz","fileCount":33,"integrity":"sha512-8jPJyXgUHjN6/N9huKzF9EAY7BGDNBh1balePd6bKJmz1BWBiaN+zXVPCDY72qSk59j95vCipAbx24dqQ9Mg3Q==","signatures":[{"sig":"MEYCIQC6O0inU7Ld0h0ecUf4xirizDtwilUprtoBhV+JYrQWegIhAKituJ7xvFLLiGTPBtivzxc16xqEmMRBrzqZGdF/TJmS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149756},"jest":{"testMatch":["**/__tests__/**/*.test.js","**/?(*.)+(spec|test).js"],"transform":{},"testEnvironment":"node","coverageDirectory":"coverage","coverageReporters":["text","lcov","html"],"collectCoverageFrom":["index.js","server.js","lib/**/*.js","!node_modules/**"]},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"d547c6bd3797db0b72da773b8bc8b27b3e3f0fae","scripts":{"test":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest","start":"node index.js","start:http":"node server.js","test:watch":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --watch","test:verbose":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --verbose","test:coverage":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --coverage"},"_npmUser":{"name":"beast2025","email":"theqwe2000@gmail.com"},"repository":{"url":"git+https://github.com/ainote-dev/ainote-mcp.git","type":"git"},"_npmVersion":"10.9.2","description":"MCP server for AI Note - Tasks, Dev Docs, and multi-device file sync (CLAUDE.md, memory files, Cursor rules, Windsurf rules)","directories":{},"_nodeVersion":"22.14.0","dependencies":{"cors":"^2.8.5","open":"^10.2.0","axios":"^1.6.0","morgan":"^1.10.0","express":"^5.1.0","cross-keychain":"^1.1.0","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","@jest/globals":"^29.7.0","axios-mock-adapter":"^1.22.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_1.2.0_1778715471712_0.26059604322023633","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@ainote/mcp","version":"1.3.0","keywords":["mcp","modelcontextprotocol","model-context-protocol","claude","claude-code","claude-desktop","cursor","windsurf","copilot","ainote","ai-note","dev-docs","claude-md","memory","tasks","task-management","todo","productivity","api","integration"],"author":{"name":"AI Note Team","email":"support@ainote.app"},"license":"MIT","_id":"@ainote/mcp@1.3.0","maintainers":[{"name":"beast2025","email":"theqwe2000@gmail.com"}],"homepage":"https://github.com/ainote-dev/ainote-mcp#readme","bugs":{"url":"https://github.com/ainote-dev/ainote-mcp/issues"},"bin":{"ainote-mcp":"index.js","ainote-mcp-http":"server.js"},"dist":{"shasum":"eea38d5ab5b12a82a733f3399ccc58484186bd6c","tarball":"https://registry.npmjs.org/@ainote/mcp/-/mcp-1.3.0.tgz","fileCount":33,"integrity":"sha512-n+lNglwmhr74yXVF14rPScubVN0jp8emlj3H0EkfKlNRf+tHd3rBYNxE2a5AEaxOOLDZE8o3Lz2T9ApZVhXx4A==","signatures":[{"sig":"MEYCIQDZJT+1rawQ6lRADhIYGsrL2FlCXah1iMy10O9Zq5cLsQIhANgJIbN5KbkpNKln2p+w1g8R+l4F76byp8d6132C/wVW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":155261},"jest":{"testMatch":["**/__tests__/**/*.test.js","**/?(*.)+(spec|test).js"],"transform":{},"testEnvironment":"node","coverageDirectory":"coverage","coverageReporters":["text","lcov","html"],"collectCoverageFrom":["index.js","server.js","lib/**/*.js","!node_modules/**"]},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"d547c6bd3797db0b72da773b8bc8b27b3e3f0fae","scripts":{"test":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest","start":"node index.js","start:http":"node server.js","test:watch":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --watch","test:verbose":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --verbose","test:coverage":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --coverage"},"_npmUser":{"name":"beast2025","email":"theqwe2000@gmail.com"},"repository":{"url":"git+https://github.com/ainote-dev/ainote-mcp.git","type":"git"},"_npmVersion":"10.9.2","description":"MCP server for AI Note - Tasks, Dev Docs, and multi-device file sync (CLAUDE.md, memory files, Cursor rules, Windsurf rules)","directories":{},"_nodeVersion":"22.14.0","dependencies":{"cors":"^2.8.5","open":"^10.2.0","axios":"^1.6.0","morgan":"^1.10.0","express":"^5.1.0","cross-keychain":"^1.1.0","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","@jest/globals":"^29.7.0","axios-mock-adapter":"^1.22.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_1.3.0_1778750839874_0.13060007243194316","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@ainote/mcp","version":"1.3.1","keywords":["mcp","modelcontextprotocol","model-context-protocol","claude","claude-code","claude-desktop","cursor","windsurf","copilot","ainote","ai-note","dev-docs","claude-md","memory","tasks","task-management","todo","productivity","api","integration"],"author":{"name":"AI Note Team","email":"support@ainote.app"},"license":"MIT","_id":"@ainote/mcp@1.3.1","maintainers":[{"name":"beast2025","email":"theqwe2000@gmail.com"}],"homepage":"https://github.com/ainote-dev/ainote-mcp#readme","bugs":{"url":"https://github.com/ainote-dev/ainote-mcp/issues"},"bin":{"ainote-mcp":"index.js","ainote-mcp-http":"server.js"},"dist":{"shasum":"afec295e7b398ad89ce6cbf4597fea84156ce93b","tarball":"https://registry.npmjs.org/@ainote/mcp/-/mcp-1.3.1.tgz","fileCount":33,"integrity":"sha512-VcLvQ9l8fxag8wumrRQJFA0iBMf/7RrN1Fka8BZ8C2SAA0ZTQAGVtizcB6ojTkedLOJcdJNTAtAKJVjrKSCVXQ==","signatures":[{"sig":"MEYCIQD000GNqwtwnNHFXF0U91HJEYRjRw7cHwSWFLmuEOMlBQIhAKZ65roaIbYZAz6Usf7aFQA20IY/yBJfIqrgmCKySfC8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":155275},"jest":{"testMatch":["**/__tests__/**/*.test.js","**/?(*.)+(spec|test).js"],"transform":{},"testEnvironment":"node","coverageDirectory":"coverage","coverageReporters":["text","lcov","html"],"collectCoverageFrom":["index.js","server.js","lib/**/*.js","!node_modules/**"]},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"d547c6bd3797db0b72da773b8bc8b27b3e3f0fae","mcpName":"io.github.seunghan91/ainote","scripts":{"test":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest","start":"node index.js","start:http":"node server.js","test:watch":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --watch","test:verbose":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --verbose","test:coverage":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --coverage"},"_npmUser":{"name":"beast2025","email":"theqwe2000@gmail.com"},"repository":{"url":"git+https://github.com/ainote-dev/ainote-mcp.git","type":"git"},"_npmVersion":"10.9.2","description":"MCP server for AI Note - Tasks, Dev Docs, and multi-device file sync (CLAUDE.md, memory files, Cursor rules, Windsurf rules)","directories":{},"_nodeVersion":"22.14.0","dependencies":{"cors":"^2.8.5","open":"^10.2.0","axios":"^1.6.0","morgan":"^1.10.0","express":"^5.1.0","cross-keychain":"^1.1.0","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","@jest/globals":"^29.7.0","axios-mock-adapter":"^1.22.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_1.3.1_1778754344675_0.5964898855526755","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"@ainote/mcp","version":"1.3.2","mcpName":"io.github.seunghan91/ainote","description":"MCP server for AI Note - Tasks, Dev Docs, and multi-device file sync (CLAUDE.md, memory files, Cursor rules, Windsurf rules)","main":"index.js","type":"module","bin":{"ainote-mcp":"index.js","ainote-mcp-http":"server.js"},"scripts":{"start":"node index.js","start:http":"node server.js","test":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest","test:watch":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --watch","test:coverage":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --coverage","test:verbose":"NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --verbose"},"keywords":["mcp","modelcontextprotocol","model-context-protocol","claude","claude-code","claude-desktop","cursor","windsurf","copilot","ainote","ai-note","dev-docs","claude-md","memory","tasks","task-management","todo","productivity","api","integration"],"author":{"name":"AI Note Team","email":"support@ainote.app"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/ainote-dev/ainote-mcp.git"},"bugs":{"url":"https://github.com/ainote-dev/ainote-mcp/issues"},"homepage":"https://github.com/ainote-dev/ainote-mcp#readme","engines":{"node":">=18.0.0"},"dependencies":{"@modelcontextprotocol/sdk":"^1.0.0","axios":"^1.6.0","cors":"^2.8.5","cross-keychain":"^1.1.0","express":"^5.1.0","morgan":"^1.10.0","open":"^10.2.0"},"devDependencies":{"@jest/globals":"^29.7.0","axios-mock-adapter":"^1.22.0","jest":"^29.7.0"},"jest":{"transform":{},"testEnvironment":"node","collectCoverageFrom":["index.js","server.js","lib/**/*.js","!node_modules/**"],"coverageDirectory":"coverage","coverageReporters":["text","lcov","html"],"testMatch":["**/__tests__/**/*.test.js","**/?(*.)+(spec|test).js"]},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_id":"@ainote/mcp@1.3.2","gitHead":"d547c6bd3797db0b72da773b8bc8b27b3e3f0fae","_nodeVersion":"22.14.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-1xlcWXUk8jLzFewfjGHQM8isa7i46d5BS4PTlGgSLFFGrcp1RakYLvNDwaR7l6pnydqQhYqTHlXMPnHmNJnUFg==","shasum":"ccd56ea502fd345c95160b78c5356bb89e6c6b37","tarball":"https://registry.npmjs.org/@ainote/mcp/-/mcp-1.3.2.tgz","fileCount":34,"unpackedSize":163047,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCu3x1pExQ0/DXOMLWUbk4duE9Qb/0kAUrpQ3o+1hR9+AIhANcZzMzs80TxmqzffOKAG1wCwGQswvrAaUK1pvjWNsxw"}]},"_npmUser":{"name":"beast2025","email":"theqwe2000@gmail.com"},"directories":{},"maintainers":[{"name":"beast2025","email":"theqwe2000@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp_1.3.2_1778755914559_0.0739048045478814"},"_hasShrinkwrap":false}},"time":{"created":"2025-07-20T01:46:20.518Z","modified":"2026-05-14T10:51:54.876Z","1.0.0":"2025-07-20T01:46:20.849Z","1.0.1":"2025-07-20T14:16:19.914Z","1.0.2":"2025-08-01T09:27:55.204Z","1.0.3":"2025-10-27T09:42:53.165Z","1.1.0":"2026-03-04T09:54:33.163Z","1.1.1":"2026-03-04T10:48:07.311Z","1.2.0":"2026-05-13T23:37:51.865Z","1.3.0":"2026-05-14T09:27:20.064Z","1.3.1":"2026-05-14T10:25:44.827Z","1.3.2":"2026-05-14T10:51:54.735Z"},"bugs":{"url":"https://github.com/ainote-dev/ainote-mcp/issues"},"author":{"name":"AI Note Team","email":"support@ainote.app"},"license":"MIT","homepage":"https://github.com/ainote-dev/ainote-mcp#readme","keywords":["mcp","modelcontextprotocol","model-context-protocol","claude","claude-code","claude-desktop","cursor","windsurf","copilot","ainote","ai-note","dev-docs","claude-md","memory","tasks","task-management","todo","productivity","api","integration"],"repository":{"type":"git","url":"git+https://github.com/ainote-dev/ainote-mcp.git"},"description":"MCP server for AI Note - Tasks, Dev Docs, and multi-device file sync (CLAUDE.md, memory files, Cursor rules, Windsurf rules)","maintainers":[{"name":"beast2025","email":"theqwe2000@gmail.com"}],"readme":"# AI Note MCP Server\n\n[![npm version](https://badge.fury.io/js/%40ainote%2Fmcp-server.svg)](https://badge.fury.io/js/%40ainote%2Fmcp-server)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nA Model Context Protocol (MCP) server that connects AI assistants to your AI Note task management system. This package enables direct interaction with your AI Note tasks through natural language conversations in Claude Desktop and other MCP-compatible platforms.\n\n> 📚 **[Complete Project Guide](../docs/PROJECT_GUIDE.md)** - 전체 프로젝트 가이드 및 아키텍처 정보\n\n## Table of Contents\n\n- [Access Methods](#access-methods)\n- [Features](#features)\n- [Authentication](#authentication)\n- [Prerequisites](#prerequisites)\n- [Installation](#installation)\n- [Configuration](#configuration)\n- [Usage](#usage)\n- [HTTP Endpoint](#http-endpoint)\n- [Available Tools](#available-tools)\n- [API Reference](#api-reference)\n- [Development](#development)\n- [Troubleshooting](#troubleshooting)\n- [Contributing](#contributing)\n- [License](#license)\n\n## Access Methods\n\nAI Note MCP server is available through three transport options to cover different integration scenarios:\n\n### 1. **stdio Mode (This Package)** - For Personal Use\n- **Installation**: `npm install -g @ainote/mcp`\n- **Usage**: Claude Desktop and other stdio-based MCP clients\n- **Setup**: Local installation with API key configuration\n- **Best for**: Individual users connecting their personal AI Note account to Claude Desktop\n\n### 2. **Local SSE Bridge (ChatGPT / MCP Apps)**\n- **Command**: `ainote-mcp-http`\n- **Protocol**: Server-Sent Events (SSE) + JSON-RPC over HTTP POST\n- **Usage**: ChatGPT Model Context Protocol connectors, other SSE-capable MCP clients\n- **Setup**: Run locally alongside your browser; supports API key or (optional) OAuth bearer tokens\n- **Best for**: Users wanting to expose AI Note tools to ChatGPT without deploying infrastructure\n\n### 3. **Hosted HTTP Endpoint** - For Platform Integration\n- **URL**: `https://api.ainote.dev/api/mcp`\n- **Protocol**: JSON-RPC 2.0 over HTTP\n- **Usage**: Platform integrations (Kakao PlayMCP, etc.)\n- **Setup**: No installation required, direct API access\n- **Best for**: Third-party platforms and services integrating AI Note functionality\n\nAll transports expose the same tool catalog. Choose the option that matches your hosting model and client capabilities.\n\n## Features\n\n- 📝 **Task Management**: Create, update, delete, and list tasks directly from Claude Desktop\n- 📄 **Dev Docs**: Manage CLAUDE.md, Cursor rules, Windsurf rules, and dev documents centrally via MCP\n- 🗂️ **Dev Category Hierarchy**: Auto-organized under `dev/` with subcategories (claude, cursor, windsurf, copilot, docs, skills, agents, commands, hooks, mcp)\n- 🔄 **Claude Environment Sync**: Push/pull `~/.claude/` skills, agents, commands, hooks across machines (macOS/WSL/Linux)\n- 🔐 **End-to-End Encryption**: `mcp` category (mcpServers + API keys) auto-encrypted client-side with age; server never sees plaintext\n- 🪪 **OS Keychain Integration**: Per-machine age identity stored in macOS Keychain / libsecret / Credential Manager (file fallback supported)\n- 🤝 **Session Handoffs**: `handoff_save` / `handoff_list` / `handoff_get` with optional `time: HHMM` for same-day disambiguation — saved under the primary vault, auto-purged after 7 days\n- 📦 **Multi-Device File Sync**: `sync_push` / `sync_pull` / `sync_list` push markdown notes into the user's git-backed primary vault — works across macOS, Linux, iOS shortcuts\n- 🏛️ **GitHub-Backed Vaults**: `vault_create` / `vault_clone` / `vault_sync` provision a private GitHub repo per vault; ainote indexes contents but never proxies git traffic\n- 🛡️ **MCP Tool Annotations**: Every tool advertises `readOnlyHint` / `destructiveHint` / `idempotentHint` / `openWorldHint` so autonomous agent runtimes can gate destructive calls\n- 🏷️ **Category Support**: Organize tasks with categories\n- 🔍 **Advanced Filtering**: 18+ filter options including date ranges, location, overdue tasks\n- ⭐ **Priority Management**: Mark tasks as important\n- 📅 **Smart Due Dates**: Human-readable format with relative time (e.g., `'26.1.25 14:30 - 오늘`)\n- 🔒 **Dual Authentication**: Support for both User API Key (24-char) and MCP Key (64-char)\n- 📊 **Usage Tracking**: Automatic API usage statistics per MCP key\n- 🌊 **Streaming API**: Real-time streaming for bulk operations and large datasets\n- 🤖 **Bot Integration**: Telegram bot support via Clawdbot + mcporter\n\n## Quick Start (No Account Needed)\n\nYou can start using AI Note MCP **without an existing account**. The MCP server includes onboarding tools that let you sign up and get an API key directly from Claude:\n\n### 1. Add to your MCP config (no API key yet)\n\n```json\n{\n  \"mcpServers\": {\n    \"ainote\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@ainote/mcp\"]\n    }\n  }\n}\n```\n\n### 2. Restart Claude Desktop\n\n### 3. Ask Claude to sign you up\n\n> \"Sign me up for AI Note with email user@example.com and password mypassword123\"\n\nClaude will call the `signup_and_get_key` tool and return your MCP API key.\n\n### 4. Add the API key to your config\n\n```json\n{\n  \"mcpServers\": {\n    \"ainote\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@ainote/mcp\"],\n      \"env\": {\n        \"AINOTE_API_KEY\": \"<your-key-from-step-3>\"\n      }\n    }\n  }\n}\n```\n\n### 5. Restart Claude Desktop again\n\nNow all tools (tasks, dev docs, etc.) are available.\n\n### CLI Signup\n\nYou can also sign up directly from the terminal:\n\n```bash\nnpx @ainote/mcp signup\n```\n\nThis will interactively ask for email, password, and name, then return your MCP API key.\n\n### CLI Tool Invocation (`call`)\n\nRun any of the 26 ainote tools directly from the shell — no Claude / Cursor / MCP host required. Useful for scripts, alfred / raycast workflows, automation, and one-off queries.\n\n```bash\n# List all tasks due today\nnpx @ainote/mcp call list_tasks --due_today=true\n\n# Save a handoff (JSON form)\nnpx @ainote/mcp call handoff_save \\\n  --json '{\"project\":\"demo\",\"topic\":\"poc\",\"content\":\"...\"}'\n\n# Get a handoff\nnpx @ainote/mcp call handoff_get --project=demo --topic=poc\n\n# Read a resource URI as JSON (load all tasks at once)\nnpx @ainote/mcp call list_tasks --limit=500\n```\n\nFlag parsing: `--key=value` is JSON.parse-d (numbers/booleans/null/arrays/objects work directly; raw strings fall back). Pass the entire arguments object via `--json '<obj>'`. Add `--raw` for the full JSON-RPC envelope.\n\nAuth resolution order: `AINOTE_API_KEY` env var → OS keychain (from `ainote-mcp login`).\n\n### Onboarding MCP Tools\n\nThese tools also work inside Claude (no API key needed):\n\n| Tool | Description |\n|------|-------------|\n| `signup_and_get_key` | Create account + get MCP key |\n| `login_and_get_key` | Login + get MCP key (existing account) |\n| `get_setup_guide` | Setup instructions |\n\n## Authentication\n\nThe CLI supports browser-based login as a more secure alternative to manually pasting API keys into your MCP config. Tokens and the MCP key are stored in the OS keychain.\n\n### Quick start\n\n```bash\nainote-mcp login                 # browser-based, recommended\nainote-mcp whoami                # verify current login\nainote-mcp logout                # revoke + clear keychain\n```\n\n### How it works\n\n`ainote-mcp login` runs an [RFC 8628](https://datatracker.ietf.org/doc/html/rfc8628) OAuth 2.0 Device Authorization Grant. The CLI generates a PKCE pair locally, opens your browser to sign in via the AI Note web app, and polls the backend until you approve. On success it stores an access token, a refresh token, and an MCP key in the OS keychain. The default MCP stdio mode automatically uses the stored MCP key — no `AINOTE_API_KEY` env var needed.\n\n### Storage locations\n\n| OS       | Location                                                                  |\n|----------|---------------------------------------------------------------------------|\n| macOS    | Keychain Access — service `@ainote/cli`                                   |\n| Linux    | libsecret (gnome-keyring / kwallet) — service `@ainote/cli`               |\n| Windows  | Credential Manager — target `@ainote/cli`                                 |\n| Fallback | `${XDG_CONFIG_HOME:-~/.config}/ainote/credentials.json` (mode `0600`)     |\n\nThe fallback file is only used when no system keychain is available (e.g. headless servers without `libsecret`).\n\n### CLI flags\n\n- `--scope=mcp,read,write` — comma-separated scopes requested for the token (default: `mcp,read,write`)\n- `--no-browser` — print the verification URL instead of auto-opening a browser (use this on SSH/CI)\n\n### Environment overrides\n\n- `AINOTE_API_URL` — backend URL (default `https://api.ainote.dev`)\n- `AINOTE_API_KEY` — pre-provisioned MCP key. When set, the login flow is bypassed entirely and this key is used as-is.\n\n### Headless / CI usage\n\nFor SSH sessions, devcontainers, or CI runners that cannot open a browser, use `--no-browser`. The CLI will print a short user code and a verification URL; open the URL on any device (laptop, phone) signed in to your AI Note account, approve the request, then return to the terminal:\n\n```bash\n$ ainote-mcp login --no-browser\nOpen this URL in any browser:\n  https://ainote.dev/oauth/cli/device?user_code=BCDF-GHJK\nWaiting for approval...\n✓ Logged in as you@example.com\n```\n\nAfter login, subsequent invocations (`ainote-mcp`, `ainote-mcp whoami`) work normally with no further interaction.\n\n### Troubleshooting\n\n| Symptom                                       | Fix                                                                                       |\n|-----------------------------------------------|-------------------------------------------------------------------------------------------|\n| `LOGIN_HINT` error on any subcommand          | Run `ainote-mcp login`                                                                    |\n| macOS Keychain prompt every run               | Open Keychain Access, find `@ainote/cli`, set access control to \"Always allow\" for `node` |\n| Browser does not open                         | Re-run with `--no-browser` and copy the URL manually                                      |\n| Persistent 401 after login                    | Tokens were revoked server-side. Run `ainote-mcp login` again                             |\n| `libsecret not available` on Linux            | Install `gnome-keyring` / `libsecret-1-0`, or rely on the file fallback (still encrypted at-rest by the OS) |\n\nSee [`docs/architecture/CLI_AUTH.md`](../docs/architecture/CLI_AUTH.md) for the full protocol specification, sequence diagram, and security model.\n\n## Prerequisites\n\n- Node.js >= 18.0.0\n- npm or yarn\n- Claude Desktop with MCP support enabled\n\n## Installation\n\n### Option 1: Install from npm\n\n```bash\nnpm install -g @ainote/mcp\n```\n\n### Option 2: Install from source\n\n```bash\ngit clone https://github.com/ainote-dev/ainote-mcp.git\ncd ainote-mcp-server\nnpm install\n```\n\n## Update\n\n### Update from npm (Recommended)\n\nTo update to the latest version when installed via npm:\n\n```bash\nnpm update -g @ainote/mcp\n```\n\nOr to install a specific version:\n\n```bash\nnpm install -g @ainote/mcp@1.0.2\n```\n\n### Update from source\n\nIf you installed from source:\n\n```bash\ncd ainote-mcp-server\ngit pull origin main\nnpm install\n```\n\nAfter updating, **restart Claude Desktop** to load the new version.\n\n## Configuration\n\nTo connect the MCP server with Claude Desktop, follow these steps.\n\n### Step 1: Get your AI Note API Key\n\nYou need an API key from your AI Note account to allow Claude to access your tasks. You can find or generate your API key in the AI Note app's settings screen.\n\n### Step 2: Configure Claude Desktop\n\nAdd the `ainote-mcp` server to your Claude Desktop configuration file. This file is located at:\n- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`\n- **Windows**: `%APPDATA%\\Claude\\claude_desktop_config.json`\n\nOpen the file and add the following JSON block inside the `mcpServers` object. **Replace `your-api-key-here` with your actual AI Note API key.**\n\n```json\n{\n  \"mcpServers\": {\n    \"ainote\": {\n      \"command\": \"ainote-mcp\",\n      \"env\": {\n        \"AINOTE_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\n*Note: If you need to connect to a self-hosted or different AI Note server, you can add the `AINOTE_API_URL` environment variable as well.*\n\n```json\n\"env\": {\n  \"AINOTE_API_KEY\": \"your-api-key-here\",\n  \"AINOTE_API_URL\": \"https://your-custom-api-url.com\"\n}\n```\n\n### Step 3: Restart Claude Desktop\n\nAfter saving the configuration file, **restart Claude Desktop** completely. The new MCP server will be loaded, and you can start managing your AI Note tasks through Claude.\n\n\n## Usage\n\nOnce configured, you can interact with your AI Note tasks through Claude:\n\n### Example Conversations\n\n```\nYou: \"Show me my pending tasks\"\nClaude: I'll retrieve your pending tasks from AI Note...\n\nYou: \"Create a new task to review the quarterly report by Friday\"\nClaude: I'll create that task for you with a due date set for Friday...\n\nYou: \"Mark task ID 123 as completed\"\nClaude: I'll mark that task as completed...\n```\n\n## HTTP Endpoint\n\nFor platform integrations and services that prefer HTTP over stdio, AI Note provides a direct HTTP endpoint:\n\n### Endpoint URL\n```\nPOST https://api.ainote.dev/api/mcp\nContent-Type: application/json\n```\n\n### Authentication\n```http\nAuthorization: Bearer YOUR_API_KEY\n```\n\n### Request Format (JSON-RPC 2.0)\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"method\": \"tools/list\",\n  \"id\": 1\n}\n```\n\n### Response Format\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"tools\": [...]\n  },\n  \"id\": 1\n}\n```\n\n### Supported Methods\n- `ping` - Health check\n- `capabilities` - Server capabilities\n- `tools/list` - List available tools\n- `tools/call` - Execute a specific tool\n\n### Platform Integration Examples\n- **Kakao PlayMCP**: Use the HTTP endpoint for seamless integration\n- **Custom Applications**: Build your own MCP client using the HTTP API\n- **Enterprise Solutions**: Direct server-to-server communication\n\nThis HTTP endpoint provides identical functionality to the stdio version, making AI Note MCP accessible to a broader range of platforms and integration scenarios.\n\n### 4. **Streaming API** - For Large Data Operations\n- **URL**: `POST https://api.ainote.dev/api/mcp/stream`\n- **Protocol**: Server-Sent Events (SSE)\n- **Usage**: Bulk operations, large task lists, real-time progress\n- **Best for**: Applications that need to handle large datasets or show progress indicators\n\n#### Streaming Methods\n| Method | Description |\n|--------|-------------|\n| `tasks/list` | Stream task list with filters |\n| `tasks/create` | Create single task with progress |\n| `tasks/analyze` | Get task statistics and insights |\n| `tasks/bulk_update` | Update multiple tasks with progress |\n| `tasks/bulk_create` | Create up to 1000 tasks at once |\n\n#### Streaming Events\n```\nevent: progress\ndata: {\"status\": \"starting\", \"total\": 100}\n\nevent: data\ndata: {\"type\": \"task\", \"data\": {...}}\n\nevent: result\ndata: {\"status\": \"success\", \"count\": 100}\n```\n\n### 5. **Telegram Bot Integration** - Via Clawdbot\n- **Setup Guide**: [CLAWDBOT_SETUP.md](./CLAWDBOT_SETUP.md)\n- **Tool**: mcporter for MCP server bridging\n- **Usage**: Natural language task management in Telegram\n\n```bash\n# Quick setup\nnpm install -g mcporter\nmcporter call ainote.list_tasks\n```\n\n### Local Development Bridge (`ainote-mcp-http`)\n\nRun the bundled HTTP/SSE bridge when you need a local endpoint for ChatGPT or other MCP clients that speak SSE:\n\n```bash\nainote-mcp-http\n```\n\nBy default the server listens on `http://localhost:3030` and exposes two endpoints:\n\n- `GET /sse` – establishes the SSE stream and returns the `sessionId`\n- `POST /messages?sessionId=...` – receives JSON-RPC payloads from the client\n- `GET /health` – simple health probe for monitoring\n\n#### Configuration\n\nEnvironment variable | Description | Default\n---|---|---\n`AINOTE_API_KEY` | API key used for MCP key authentication | **required**\n`AINOTE_API_URL` | Target AI Note API base URL | `https://api.ainote.dev`\n`AINOTE_MCP_HTTP_PORT` | Local port for the SSE server | `3030`\n`AINOTE_MCP_ALLOWED_ORIGINS` | Comma-separated list of allowed browser origins | _any_\n`AINOTE_MCP_ALLOWED_HOSTS` | Comma-separated list of allowed `Host` headers | _any_\n`AINOTE_ENABLE_OAUTH_AUTH` | Set to `true` to allow Bearer tokens (OAuth) | `false`\n\nWhen OAuth is enabled the server expects `Authorization: Bearer ...` headers from the client and forwards them to the AI Note API.\n\n## Available Tools\n\n### list_tasks\n\nList tasks from AI Note with advanced filtering options.\n\n**Basic Parameters:**\n- `status` (optional): Filter by status - \"pending\" or \"completed\"\n- `limit` (optional): Maximum number of tasks (default: 25, max: 500)\n- `search` (optional): Search keyword in task content\n- `is_important` (optional): Filter important tasks only\n\n**Location & Category:**\n- `location` (optional): Filter by location (partial match, e.g., \"여의도\")\n- `category_id` (optional): Filter by category UUID\n\n**Date Range Filters:**\n- `due_date_start` / `due_date_end`: Filter by due date range\n- `completed_date_start` / `completed_date_end`: Filter by completion date\n- `created_date_start` / `created_date_end`: Filter by creation date\n\n**Special Filters:**\n- `overdue` (optional): Filter overdue incomplete tasks\n- `due_today` (optional): Filter tasks due today\n- `has_notification` (optional): Filter by notification status\n\n**Sorting:**\n- `sort_by` (optional): Sort field - \"due_date\", \"created_at\", \"completed_at\", \"updated_at\", \"is_important\"\n- `sort_order` (optional): Sort direction - \"asc\" or \"desc\"\n\n### create_task\n\nCreate a new task in AI Note.\n\n**Parameters:**\n- `content` (required): Task description\n- `is_important` (optional): Mark as important (boolean)\n- `due_date` (optional): Due date in ISO format\n- `category_id` (optional): Category ID to assign\n\n### update_task\n\nUpdate an existing task.\n\n**Parameters:**\n- `id` (required): Task ID\n- `content` (optional): New task content\n- `is_important` (optional): Update important status\n- `completed_at` (optional): Mark as completed (ISO format) or null to uncomplete\n\n### delete_task\n\nSoft delete a task.\n\n**Parameters:**\n- `id` (required): Task ID to delete\n\n### list_categories\n\nList all available categories.\n\n**Parameters:** None\n\n---\n\n### Dev Doc Tools (v1.1.0+)\n\nManage AI coding tool configuration files and dev documents centrally. All docs are organized under the `dev/` category hierarchy.\n\n#### list_dev_docs\n\nList dev documents with optional filtering.\n\n**Parameters:**\n- `category` (optional): Subcategory filter (claude, cursor, windsurf, copilot, docs)\n- `search` (optional): Search keyword in document title\n- `content_type` (optional): Filter by type - \"markdown\", \"json\", \"yaml\", \"text\"\n\n#### get_dev_doc\n\nGet a single dev document by title or id.\n\n**Parameters:**\n- `title` or `id` (one required): Document identifier\n- `category` (optional): Subcategory to disambiguate title\n- `include_versions` (optional): Include version history\n\n#### create_dev_doc\n\nCreate a new dev document under `dev/` category.\n\n**Parameters:**\n- `title` (required): Document title (e.g., \"project-a-claude.md\")\n- `content` (required): Document content\n- `category` (optional): Subcategory (default: \"docs\")\n- `content_type` (optional): Auto-detected from title extension\n\n#### update_dev_doc\n\nUpdate a dev document with replace, append, or prepend modes.\n\n**Parameters:**\n- `title` or `id` (one required): Document identifier\n- `content` (required): New content\n- `mode` (optional): \"replace\" (default), \"append\", or \"prepend\"\n\n#### delete_dev_doc\n\nSoft delete a dev document.\n\n**Parameters:**\n- `title` or `id` (one required): Document identifier\n\n#### list_dev_categories\n\nList all subcategories under `dev/` with document counts.\n\n**Parameters:** None\n\n#### Example: Store CLAUDE.md in ainote\n\n```\nYou: \"Save this project's CLAUDE.md content to ainote\"\nClaude: I'll create a dev doc in the claude category...\n→ create_dev_doc(title: \"myproject-claude.md\", content: \"...\", category: \"claude\")\n\nYou: \"Update my cursor rules in ainote\"\nClaude: I'll update the cursor rules doc...\n→ update_dev_doc(title: \"api-rules.mdc\", category: \"cursor\", content: \"...\")\n\nYou: \"Show me all my dev docs\"\nClaude: I'll list all documents under dev/...\n→ list_dev_docs()\n```\n\n### Session Handoffs (cross-session / cross-device continuation)\n\nSave a self-contained handoff note when the context window fills up or when you need to continue on another machine. Stored in the user's primary vault under `handoffs/`, auto-purged after 7 days.\n\n| Tool | Purpose |\n|------|---------|\n| `handoff_save` | Write a handoff (`project`, `topic`, `content`, optional `date`, optional `time` HHMM for same-day disambiguation) |\n| `handoff_list` | Most-recent-first list, optionally filtered by project. ⚠️ Triggers the 7-day stale purge as a side effect |\n| `handoff_get` | Fetch by `project` + `topic` (+ optional `date`/`time`). Returns latest if `date` omitted. Same purge side effect |\n\n```text\nYou: \"Save a handoff for the logi-phase4 work I'm wrapping up\"\nClaude: → handoff_save({project: \"logi\", topic: \"phase4\", time: \"1555\", content: \"...\"})\n       Stored at handoffs/logi-phase4-1555-2026-05-14.txt\n\n(later, on the laptop):\nYou: \"Pick up the logi-phase4 handoff\"\nClaude: → handoff_get({project: \"logi\", topic: \"phase4\"})\n```\n\n### Multi-Device File Sync (`sync_*` / `vault_sync`)\n\n`sync_push` / `sync_pull` / `sync_list` operate on the user's git-backed primary vault. `vault_sync` is the unified entrypoint that accepts an `action: list|pull|push` argument.\n\n| Tool | Purpose |\n|------|---------|\n| `sync_push` | Push a markdown note (path + content) into the vault repo |\n| `sync_pull` | Read a markdown note from the vault by path |\n| `sync_list` | Enumerate vault paths (optionally filtered) |\n| `vault_sync` | Unified wrapper around the above three |\n\n### GitHub-Backed Vaults\n\n| Tool | Purpose |\n|------|---------|\n| `vault_list` | List the user's vaults + sync status + indexed file counts |\n| `vault_create` | Create a new private vault as a GitHub repo (requires the ainote GitHub App install) |\n| `vault_clone` | Return the git clone URL for an existing vault. ainote does **not** proxy git traffic — use your usual GitHub credentials |\n| `vault_connect_status` | Check whether the ainote GitHub App is installed for this user; returns an install URL otherwise |\n\n---\n\n## Annotations Reference\n\nEvery tool advertises four MCP-spec annotations on `tools/list` so autonomous agent runtimes can reason about safety:\n\n| Hint | Meaning | Agent action |\n|------|---------|--------------|\n| `readOnlyHint: true` | Tool does not mutate any server state | Safe to call without consent gates |\n| `destructiveHint: true` | Tool deletes / overwrites / purges state | Require explicit user consent or transaction boundary |\n| `idempotentHint: true` | Repeating the call with same args ends in the same state | Safe to retry on timeout / network error |\n| `openWorldHint: true` | Tool reaches an external system (GitHub, SMTP, third-party) | Outcomes may be non-deterministic; cache cautiously |\n\n**Notable annotations:**\n\n- `handoff_list` / `handoff_get` are marked `destructiveHint: true` because they run a 7-day stale-handoff purge on every call.\n- `login_and_get_key` is marked `readOnlyHint: false` because it creates a default MCP key when the user has none.\n- `vault_sync` is conservatively `destructiveHint: true` because `action=push` with empty content can delete an indexed file.\n\nSee the source-of-truth mapping at [`docs/todo/MCP_TOOL_ANNOTATIONS_MAPPING.md`](https://github.com/seunghan91/ainote/blob/main/docs/todo/MCP_TOOL_ANNOTATIONS_MAPPING.md) in the ainote repo.\n\n---\n\n## Agent Compatibility\n\nainote MCP works with any client that speaks Model Context Protocol over stdio or HTTP. Tested setups:\n\n### Claude Desktop / Claude Code (stdio via this npm package)\n\n```json\n{\n  \"mcpServers\": {\n    \"ainote\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@ainote/mcp\"],\n      \"env\": { \"AINOTE_API_KEY\": \"...\" }\n    }\n  }\n}\n```\n\n### Claude Code (direct HTTP — recommended for full feature set)\n\n```json\n{\n  \"mcpServers\": {\n    \"ainote\": {\n      \"type\": \"http\",\n      \"url\": \"https://api.ainote.dev/api/mcp\",\n      \"headers\": { \"Authorization\": \"McpKey <YOUR_MCP_KEY>\" }\n    }\n  }\n}\n```\n\n> The `type: \"http\"` field is required — without it, Claude Code's user-level MCP loader silently rejects the entire `mcpServers` block.\n\n### Cursor / Windsurf (stdio)\n\nSame as Claude Desktop config — both editors accept the `command + args + env` shape.\n\n### ChatGPT / OpenAI Custom GPTs\n\nUse the hosted HTTP endpoint via OpenAI Connectors or Custom GPT Actions. The MCP JSON-RPC body works as a regular HTTPS POST. An OpenAPI 3.1 mirror of the tool surface is planned (see `docs/todo/AGENT_INTEROP_ROADMAP_2026.md` Phase 1.4).\n\n### LangChain / LangGraph\n\nWrap the HTTP endpoint as a remote tool. Pass `Authorization: McpKey <YOUR_MCP_KEY>` and POST JSON-RPC requests. Tool definitions can be discovered via `tools/list`.\n\n---\n\n## API Reference\n\nThe MCP server communicates with the AI Note API using the following endpoints:\n\n- `GET /api/mcp/tasks` - List tasks\n- `POST /api/mcp/tasks` - Create task\n- `PUT /api/mcp/tasks/:id` - Update task\n- `DELETE /api/mcp/tasks/:id` - Delete task\n- `GET /api/mcp/categories` - List categories\n\nAll requests require authentication via the `Authorization` header with your API key.\n\n## Development\n\n### Running Locally\n\n```bash\n# Clone the repository\ngit clone https://github.com/ainote-dev/ainote-mcp.git\ncd ainote-mcp-server\n\n# Install dependencies\nnpm install\n\n# Run the server\nnpm start\n```\n\n### Testing with Claude Desktop\n\n1. Update your Claude Desktop config to point to your local development server\n2. Set environment variables for testing\n3. Restart Claude Desktop\n4. Check the MCP connection status in Claude Desktop settings\n\n### Project Structure\n\n```\nainote-mcp-server/\n├── index.js          # Main server implementation\n├── package.json      # Package configuration\n├── README.md         # English documentation\n├── README-ko.md      # Korean documentation\n└── LICENSE           # MIT license\n```\n\n## Troubleshooting\n\n### Common Issues\n\n1. **\"API key not found\" error**\n   - Ensure `AINOTE_API_KEY` is set in your environment or Claude config\n   - Check that the API key is valid and has proper permissions\n\n2. **\"Connection refused\" error**\n   - Verify the API URL is correct\n   - Check network connectivity\n   - Ensure the AI Note API server is running\n\n3. **\"Tool not found\" error**\n   - Restart Claude Desktop after configuration changes\n   - Verify the MCP server is properly configured in Claude Desktop\n\n4. **Tasks not appearing**\n   - Check API key permissions\n   - Verify you're querying the correct status (pending/completed)\n   - Try using the search parameter\n\n### Debug Mode\n\nTo enable debug logging:\n\n```bash\nexport DEBUG=mcp:*\n```\n\n## Contributing\n\nWe welcome contributions! Please follow these steps:\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n### Development Guidelines\n\n- Follow the existing code style\n- Add tests for new features\n- Update documentation as needed\n- Ensure all tests pass before submitting PR\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## Support\n\n- 📧 Email: support@ainote.dev\n- 🐛 Issues: [GitHub Issues](https://github.com/ainote-dev/ainote-mcp/issues)\n- 💬 Discord: [Join our community](https://discord.gg/ainote)\n\n## Acknowledgments\n\n- Built with [Model Context Protocol SDK](https://github.com/modelcontextprotocol/sdk)\n- Powered by [AI Note](https://ainote.dev)\n- Made for [Claude Desktop](https://claude.ai/desktop)","readmeFilename":"README.md"}