aimeat 1.10.0 → 1.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/README.md +4 -0
  2. package/dist/.env.example +31 -0
  3. package/dist/locales/en.json +54 -0
  4. package/dist/locales/fi.json +54 -0
  5. package/dist/public/connect.fi.html +350 -0
  6. package/dist/public/connect.html +353 -0
  7. package/dist/public/css/views/agents-detail.css +108 -0
  8. package/dist/public/css/views/profile.css +1 -0
  9. package/dist/public/privacy.fi.html +246 -0
  10. package/dist/public/privacy.html +246 -0
  11. package/dist/public/views/profile/agents/agent-card.js +22 -2
  12. package/dist/public/views/profile/agents-tab.js +255 -17
  13. package/dist/scripts/audit-mcp-tools.d.ts +1 -0
  14. package/dist/scripts/audit-mcp-tools.d.ts.map +1 -1
  15. package/dist/scripts/audit-mcp-tools.js +19 -0
  16. package/dist/scripts/audit-mcp-tools.js.map +1 -1
  17. package/dist/src/cli/connect/agent-registry.d.ts +51 -0
  18. package/dist/src/cli/connect/agent-registry.d.ts.map +1 -0
  19. package/dist/src/cli/connect/agent-registry.js +84 -0
  20. package/dist/src/cli/connect/agent-registry.js.map +1 -0
  21. package/dist/src/cli/connect/auth.d.ts.map +1 -1
  22. package/dist/src/cli/connect/auth.js +27 -3
  23. package/dist/src/cli/connect/auth.js.map +1 -1
  24. package/dist/src/cli/connect/config.d.ts +82 -6
  25. package/dist/src/cli/connect/config.d.ts.map +1 -1
  26. package/dist/src/cli/connect/config.js +76 -1
  27. package/dist/src/cli/connect/config.js.map +1 -1
  28. package/dist/src/cli/connect/keychain.d.ts +10 -0
  29. package/dist/src/cli/connect/keychain.d.ts.map +1 -1
  30. package/dist/src/cli/connect/keychain.js +45 -3
  31. package/dist/src/cli/connect/keychain.js.map +1 -1
  32. package/dist/src/cli/connect/mcp/poller.d.ts +19 -13
  33. package/dist/src/cli/connect/mcp/poller.d.ts.map +1 -1
  34. package/dist/src/cli/connect/mcp/poller.js +52 -15
  35. package/dist/src/cli/connect/mcp/poller.js.map +1 -1
  36. package/dist/src/cli/connect/mcp/resources.d.ts +10 -4
  37. package/dist/src/cli/connect/mcp/resources.d.ts.map +1 -1
  38. package/dist/src/cli/connect/mcp/resources.js +5 -7
  39. package/dist/src/cli/connect/mcp/resources.js.map +1 -1
  40. package/dist/src/cli/connect/mcp/server.d.ts.map +1 -1
  41. package/dist/src/cli/connect/mcp/server.js +42 -21
  42. package/dist/src/cli/connect/mcp/server.js.map +1 -1
  43. package/dist/src/cli/connect/mcp/tools/_registry.d.ts +15 -0
  44. package/dist/src/cli/connect/mcp/tools/_registry.d.ts.map +1 -0
  45. package/dist/src/cli/connect/mcp/tools/_registry.js +19 -0
  46. package/dist/src/cli/connect/mcp/tools/_registry.js.map +1 -0
  47. package/dist/src/cli/connect/mcp/tools/agent-caps.d.ts +6 -2
  48. package/dist/src/cli/connect/mcp/tools/agent-caps.d.ts.map +1 -1
  49. package/dist/src/cli/connect/mcp/tools/agent-caps.js +12 -4
  50. package/dist/src/cli/connect/mcp/tools/agent-caps.js.map +1 -1
  51. package/dist/src/cli/connect/mcp/tools/agent-management.d.ts +18 -0
  52. package/dist/src/cli/connect/mcp/tools/agent-management.d.ts.map +1 -0
  53. package/dist/src/cli/connect/mcp/tools/agent-management.js +23 -0
  54. package/dist/src/cli/connect/mcp/tools/agent-management.js.map +1 -0
  55. package/dist/src/cli/connect/mcp/tools/agent-messages.d.ts +7 -3
  56. package/dist/src/cli/connect/mcp/tools/agent-messages.d.ts.map +1 -1
  57. package/dist/src/cli/connect/mcp/tools/agent-messages.js +12 -4
  58. package/dist/src/cli/connect/mcp/tools/agent-messages.js.map +1 -1
  59. package/dist/src/cli/connect/mcp/tools/agent-tasks.d.ts +13 -7
  60. package/dist/src/cli/connect/mcp/tools/agent-tasks.d.ts.map +1 -1
  61. package/dist/src/cli/connect/mcp/tools/agent-tasks.js +31 -9
  62. package/dist/src/cli/connect/mcp/tools/agent-tasks.js.map +1 -1
  63. package/dist/src/cli/connect/mcp/tools/agent-telemetry.d.ts +7 -3
  64. package/dist/src/cli/connect/mcp/tools/agent-telemetry.d.ts.map +1 -1
  65. package/dist/src/cli/connect/mcp/tools/agent-telemetry.js +8 -4
  66. package/dist/src/cli/connect/mcp/tools/agent-telemetry.js.map +1 -1
  67. package/dist/src/cli/connect/mcp/tools/apps.d.ts +5 -2
  68. package/dist/src/cli/connect/mcp/tools/apps.d.ts.map +1 -1
  69. package/dist/src/cli/connect/mcp/tools/apps.js +8 -6
  70. package/dist/src/cli/connect/mcp/tools/apps.js.map +1 -1
  71. package/dist/src/cli/connect/mcp/tools/boards.d.ts +5 -2
  72. package/dist/src/cli/connect/mcp/tools/boards.d.ts.map +1 -1
  73. package/dist/src/cli/connect/mcp/tools/boards.js +10 -8
  74. package/dist/src/cli/connect/mcp/tools/boards.js.map +1 -1
  75. package/dist/src/cli/connect/mcp/tools/capabilities.d.ts +5 -2
  76. package/dist/src/cli/connect/mcp/tools/capabilities.d.ts.map +1 -1
  77. package/dist/src/cli/connect/mcp/tools/capabilities.js +10 -8
  78. package/dist/src/cli/connect/mcp/tools/capabilities.js.map +1 -1
  79. package/dist/src/cli/connect/mcp/tools/catalogue.d.ts +5 -2
  80. package/dist/src/cli/connect/mcp/tools/catalogue.d.ts.map +1 -1
  81. package/dist/src/cli/connect/mcp/tools/catalogue.js +6 -4
  82. package/dist/src/cli/connect/mcp/tools/catalogue.js.map +1 -1
  83. package/dist/src/cli/connect/mcp/tools/consent.d.ts +5 -2
  84. package/dist/src/cli/connect/mcp/tools/consent.d.ts.map +1 -1
  85. package/dist/src/cli/connect/mcp/tools/consent.js +6 -4
  86. package/dist/src/cli/connect/mcp/tools/consent.js.map +1 -1
  87. package/dist/src/cli/connect/mcp/tools/core.d.ts +4 -2
  88. package/dist/src/cli/connect/mcp/tools/core.d.ts.map +1 -1
  89. package/dist/src/cli/connect/mcp/tools/core.js +23 -19
  90. package/dist/src/cli/connect/mcp/tools/core.js.map +1 -1
  91. package/dist/src/cli/connect/mcp/tools/cortex.d.ts +5 -2
  92. package/dist/src/cli/connect/mcp/tools/cortex.d.ts.map +1 -1
  93. package/dist/src/cli/connect/mcp/tools/cortex.js +8 -6
  94. package/dist/src/cli/connect/mcp/tools/cortex.js.map +1 -1
  95. package/dist/src/cli/connect/mcp/tools/extensions.d.ts +5 -2
  96. package/dist/src/cli/connect/mcp/tools/extensions.d.ts.map +1 -1
  97. package/dist/src/cli/connect/mcp/tools/extensions.js +10 -8
  98. package/dist/src/cli/connect/mcp/tools/extensions.js.map +1 -1
  99. package/dist/src/cli/connect/mcp/tools/flags.d.ts +5 -2
  100. package/dist/src/cli/connect/mcp/tools/flags.d.ts.map +1 -1
  101. package/dist/src/cli/connect/mcp/tools/flags.js +4 -2
  102. package/dist/src/cli/connect/mcp/tools/flags.js.map +1 -1
  103. package/dist/src/cli/connect/mcp/tools/groups.d.ts +5 -2
  104. package/dist/src/cli/connect/mcp/tools/groups.d.ts.map +1 -1
  105. package/dist/src/cli/connect/mcp/tools/groups.js +8 -6
  106. package/dist/src/cli/connect/mcp/tools/groups.js.map +1 -1
  107. package/dist/src/cli/connect/mcp/tools/handbook.d.ts +5 -2
  108. package/dist/src/cli/connect/mcp/tools/handbook.d.ts.map +1 -1
  109. package/dist/src/cli/connect/mcp/tools/handbook.js +4 -2
  110. package/dist/src/cli/connect/mcp/tools/handbook.js.map +1 -1
  111. package/dist/src/cli/connect/mcp/tools/index.d.ts +10 -6
  112. package/dist/src/cli/connect/mcp/tools/index.d.ts.map +1 -1
  113. package/dist/src/cli/connect/mcp/tools/index.js +24 -22
  114. package/dist/src/cli/connect/mcp/tools/index.js.map +1 -1
  115. package/dist/src/cli/connect/mcp/tools/instances.d.ts +5 -2
  116. package/dist/src/cli/connect/mcp/tools/instances.d.ts.map +1 -1
  117. package/dist/src/cli/connect/mcp/tools/instances.js +6 -4
  118. package/dist/src/cli/connect/mcp/tools/instances.js.map +1 -1
  119. package/dist/src/cli/connect/mcp/tools/knowledge.d.ts +5 -2
  120. package/dist/src/cli/connect/mcp/tools/knowledge.d.ts.map +1 -1
  121. package/dist/src/cli/connect/mcp/tools/knowledge.js +7 -5
  122. package/dist/src/cli/connect/mcp/tools/knowledge.js.map +1 -1
  123. package/dist/src/cli/connect/mcp/tools/memory-ext.d.ts +5 -2
  124. package/dist/src/cli/connect/mcp/tools/memory-ext.d.ts.map +1 -1
  125. package/dist/src/cli/connect/mcp/tools/memory-ext.js +4 -2
  126. package/dist/src/cli/connect/mcp/tools/memory-ext.js.map +1 -1
  127. package/dist/src/cli/connect/mcp/tools/onboarding.d.ts +8 -4
  128. package/dist/src/cli/connect/mcp/tools/onboarding.d.ts.map +1 -1
  129. package/dist/src/cli/connect/mcp/tools/onboarding.js +24 -7
  130. package/dist/src/cli/connect/mcp/tools/onboarding.js.map +1 -1
  131. package/dist/src/cli/connect/mcp/tools/organisms.d.ts +5 -2
  132. package/dist/src/cli/connect/mcp/tools/organisms.d.ts.map +1 -1
  133. package/dist/src/cli/connect/mcp/tools/organisms.js +8 -6
  134. package/dist/src/cli/connect/mcp/tools/organisms.js.map +1 -1
  135. package/dist/src/cli/connect/mcp/tools/wallet-ext.d.ts +5 -2
  136. package/dist/src/cli/connect/mcp/tools/wallet-ext.d.ts.map +1 -1
  137. package/dist/src/cli/connect/mcp/tools/wallet-ext.js +4 -2
  138. package/dist/src/cli/connect/mcp/tools/wallet-ext.js.map +1 -1
  139. package/dist/src/cli/connect/task-runner.d.ts +15 -0
  140. package/dist/src/cli/connect/task-runner.d.ts.map +1 -0
  141. package/dist/src/cli/connect/task-runner.js +214 -0
  142. package/dist/src/cli/connect/task-runner.js.map +1 -0
  143. package/dist/src/cli/connect/tool-call.d.ts.map +1 -1
  144. package/dist/src/cli/connect/tool-call.js +33 -0
  145. package/dist/src/cli/connect/tool-call.js.map +1 -1
  146. package/dist/src/cli/init-wizard.d.ts.map +1 -1
  147. package/dist/src/cli/init-wizard.js +137 -0
  148. package/dist/src/cli/init-wizard.js.map +1 -1
  149. package/dist/src/config.d.ts +56 -0
  150. package/dist/src/config.d.ts.map +1 -1
  151. package/dist/src/config.js +73 -0
  152. package/dist/src/config.js.map +1 -1
  153. package/dist/src/index.js +95 -1
  154. package/dist/src/index.js.map +1 -1
  155. package/dist/src/mcp/agent-capabilities.d.ts +2 -0
  156. package/dist/src/mcp/agent-capabilities.d.ts.map +1 -1
  157. package/dist/src/mcp/agent-capabilities.js +5 -2
  158. package/dist/src/mcp/agent-capabilities.js.map +1 -1
  159. package/dist/src/mcp/agent-messages.d.ts +2 -0
  160. package/dist/src/mcp/agent-messages.d.ts.map +1 -1
  161. package/dist/src/mcp/agent-messages.js +5 -2
  162. package/dist/src/mcp/agent-messages.js.map +1 -1
  163. package/dist/src/mcp/agent-onboarding.d.ts +2 -0
  164. package/dist/src/mcp/agent-onboarding.d.ts.map +1 -1
  165. package/dist/src/mcp/agent-onboarding.js +8 -5
  166. package/dist/src/mcp/agent-onboarding.js.map +1 -1
  167. package/dist/src/mcp/agent-tasks.d.ts +2 -0
  168. package/dist/src/mcp/agent-tasks.d.ts.map +1 -1
  169. package/dist/src/mcp/agent-tasks.js +10 -7
  170. package/dist/src/mcp/agent-tasks.js.map +1 -1
  171. package/dist/src/mcp/agent-telemetry.d.ts +2 -0
  172. package/dist/src/mcp/agent-telemetry.d.ts.map +1 -1
  173. package/dist/src/mcp/agent-telemetry.js +4 -1
  174. package/dist/src/mcp/agent-telemetry.js.map +1 -1
  175. package/dist/src/mcp/annotations.d.ts +49 -0
  176. package/dist/src/mcp/annotations.d.ts.map +1 -0
  177. package/dist/src/mcp/annotations.js +178 -0
  178. package/dist/src/mcp/annotations.js.map +1 -0
  179. package/dist/src/mcp/apps.d.ts +2 -0
  180. package/dist/src/mcp/apps.d.ts.map +1 -1
  181. package/dist/src/mcp/apps.js +8 -5
  182. package/dist/src/mcp/apps.js.map +1 -1
  183. package/dist/src/mcp/boards.d.ts +2 -0
  184. package/dist/src/mcp/boards.d.ts.map +1 -1
  185. package/dist/src/mcp/boards.js +10 -7
  186. package/dist/src/mcp/boards.js.map +1 -1
  187. package/dist/src/mcp/capabilities.d.ts +2 -0
  188. package/dist/src/mcp/capabilities.d.ts.map +1 -1
  189. package/dist/src/mcp/capabilities.js +8 -7
  190. package/dist/src/mcp/capabilities.js.map +1 -1
  191. package/dist/src/mcp/catalog/definitions.d.ts.map +1 -1
  192. package/dist/src/mcp/catalog/definitions.js +20 -0
  193. package/dist/src/mcp/catalog/definitions.js.map +1 -1
  194. package/dist/src/mcp/catalogue.d.ts +2 -0
  195. package/dist/src/mcp/catalogue.d.ts.map +1 -1
  196. package/dist/src/mcp/catalogue.js +6 -3
  197. package/dist/src/mcp/catalogue.js.map +1 -1
  198. package/dist/src/mcp/chat-instances.d.ts +2 -0
  199. package/dist/src/mcp/chat-instances.d.ts.map +1 -1
  200. package/dist/src/mcp/chat-instances.js +6 -3
  201. package/dist/src/mcp/chat-instances.js.map +1 -1
  202. package/dist/src/mcp/consent.d.ts +2 -0
  203. package/dist/src/mcp/consent.d.ts.map +1 -1
  204. package/dist/src/mcp/consent.js +6 -3
  205. package/dist/src/mcp/consent.js.map +1 -1
  206. package/dist/src/mcp/core.d.ts +2 -0
  207. package/dist/src/mcp/core.d.ts.map +1 -1
  208. package/dist/src/mcp/core.js +21 -18
  209. package/dist/src/mcp/core.js.map +1 -1
  210. package/dist/src/mcp/cortex.d.ts +2 -0
  211. package/dist/src/mcp/cortex.d.ts.map +1 -1
  212. package/dist/src/mcp/cortex.js +8 -5
  213. package/dist/src/mcp/cortex.js.map +1 -1
  214. package/dist/src/mcp/extensions.d.ts +2 -0
  215. package/dist/src/mcp/extensions.d.ts.map +1 -1
  216. package/dist/src/mcp/extensions.js +10 -7
  217. package/dist/src/mcp/extensions.js.map +1 -1
  218. package/dist/src/mcp/flags.d.ts +2 -0
  219. package/dist/src/mcp/flags.d.ts.map +1 -1
  220. package/dist/src/mcp/flags.js +4 -1
  221. package/dist/src/mcp/flags.js.map +1 -1
  222. package/dist/src/mcp/knowledge.d.ts +2 -0
  223. package/dist/src/mcp/knowledge.d.ts.map +1 -1
  224. package/dist/src/mcp/knowledge.js +7 -4
  225. package/dist/src/mcp/knowledge.js.map +1 -1
  226. package/dist/src/mcp/memory-extended.d.ts +2 -0
  227. package/dist/src/mcp/memory-extended.d.ts.map +1 -1
  228. package/dist/src/mcp/memory-extended.js +5 -2
  229. package/dist/src/mcp/memory-extended.js.map +1 -1
  230. package/dist/src/mcp/organisms.d.ts +2 -0
  231. package/dist/src/mcp/organisms.d.ts.map +1 -1
  232. package/dist/src/mcp/organisms.js +8 -5
  233. package/dist/src/mcp/organisms.js.map +1 -1
  234. package/dist/src/mcp/prompts.d.ts +2 -0
  235. package/dist/src/mcp/prompts.d.ts.map +1 -1
  236. package/dist/src/mcp/prompts.js +4 -1
  237. package/dist/src/mcp/prompts.js.map +1 -1
  238. package/dist/src/mcp/sharing-groups.d.ts +2 -0
  239. package/dist/src/mcp/sharing-groups.d.ts.map +1 -1
  240. package/dist/src/mcp/sharing-groups.js +8 -5
  241. package/dist/src/mcp/sharing-groups.js.map +1 -1
  242. package/dist/src/mcp/wallet-extended.d.ts +2 -0
  243. package/dist/src/mcp/wallet-extended.d.ts.map +1 -1
  244. package/dist/src/mcp/wallet-extended.js +4 -1
  245. package/dist/src/mcp/wallet-extended.js.map +1 -1
  246. package/dist/src/models/agent-onboarding-schemas.d.ts +18 -1
  247. package/dist/src/models/agent-onboarding-schemas.d.ts.map +1 -1
  248. package/dist/src/models/agent-onboarding-schemas.js +36 -2
  249. package/dist/src/models/agent-onboarding-schemas.js.map +1 -1
  250. package/dist/src/models/schemas.d.ts +6 -0
  251. package/dist/src/models/schemas.d.ts.map +1 -1
  252. package/dist/src/models/schemas.js +1 -0
  253. package/dist/src/models/schemas.js.map +1 -1
  254. package/dist/src/routes/agent-onboarding.d.ts.map +1 -1
  255. package/dist/src/routes/agent-onboarding.js +40 -30
  256. package/dist/src/routes/agent-onboarding.js.map +1 -1
  257. package/dist/src/routes/agents.d.ts.map +1 -1
  258. package/dist/src/routes/agents.js +74 -24
  259. package/dist/src/routes/agents.js.map +1 -1
  260. package/dist/src/routes/portal.d.ts +7 -0
  261. package/dist/src/routes/portal.d.ts.map +1 -1
  262. package/dist/src/routes/portal.js +121 -0
  263. package/dist/src/routes/portal.js.map +1 -1
  264. package/dist/src/server-bootstrap/static-files.d.ts +16 -0
  265. package/dist/src/server-bootstrap/static-files.d.ts.map +1 -1
  266. package/dist/src/server-bootstrap/static-files.js +32 -3
  267. package/dist/src/server-bootstrap/static-files.js.map +1 -1
  268. package/dist/src/storage/interface.d.ts +10 -0
  269. package/dist/src/storage/interface.d.ts.map +1 -1
  270. package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
  271. package/dist/src/storage/providers/mongodb/index.js +2 -1
  272. package/dist/src/storage/providers/mongodb/index.js.map +1 -1
  273. package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
  274. package/dist/src/storage/providers/sqlite/index.js +6 -4
  275. package/dist/src/storage/providers/sqlite/index.js.map +1 -1
  276. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  277. package/dist/src/storage/providers/sqlite/schema.js +4 -0
  278. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  279. package/package.json +1 -1
  280. package/prisma/schema.prisma +1 -0
package/README.md CHANGED
@@ -145,6 +145,10 @@ npx aimeat connect --url https://your-node --owner your-handle [--agent name]
145
145
 
146
146
  For MCP-capable runtimes (Claude Desktop, MCP-aware IDEs), run `aimeat connect serve` afterwards to attach the AIMEAT toolset over stdio. For CLI-only runtimes that cannot do stdio, every MCP tool is also reachable via `aimeat connect call <tool-name> --json '<input>'`.
147
147
 
148
+ **Multi-agent connector.** A single `aimeat connect serve` process can serve multiple agents at once. Add more agents with `aimeat connect add --agent <name> --url ... --owner ...`; list them with `aimeat connect list`; remove with `aimeat connect remove <name>`. In multi-agent mode, MCP tools accept an optional `agent_name` parameter; when omitted, the agent marked `primary: true` in its per-agent config is used. This is the path for connecting one interactive agent (Claude Code) plus several **task-runner** agents (e.g. CrewAI crews) from one connector process -- see [docs/integrations/crewai.md](docs/integrations/crewai.md) for the task-runner pattern.
149
+
150
+ **Agent modes.** Every agent declares a mode at registration: `autonomous` (continuous), `interactive` (chat/IDE, default), `task-runner` (triggered, runs one task, exits), or `coordinator` (orchestrates others). Mode picks the Hello Integration flow -- `task-runner` agents get a reduced 5-step onboarding instead of the full 13 because they have no interactive command surface. Combine modes with owner-managed **tags** (`crew:*`, `source:*`, `role:*`, `project:*`) for filtering and grouping in the profile UI. Details: [docs/coding-guidelines/agent-tags.md](docs/coding-guidelines/agent-tags.md).
151
+
148
152
  **2. Copy the prompt from your profile.** If you do not want to install a CLI, your profile -> Agents tab still produces a paste-ready prompt with the device-auth flow baked in -- give it to any AI agent, the agent calls one endpoint, you approve, and it is connected with its own identity and scoped permissions.
149
153
 
150
154
  Claude Pro, ChatGPT Plus, and other MCP-capable AIs connect directly as MCP clients. OpenClaw, Hermes, Claude Code, and Cursor all work. Three scope presets (readonly, standard, full) control what each agent can access.
package/dist/.env.example CHANGED
@@ -35,8 +35,39 @@ AIMEAT_PORT=40050
35
35
  # Startup logs will show the anonymous prompt URL and share prompt URL.
36
36
  # AIMEAT_ANONYMOUS=false
37
37
  # CORS: comma-separated list of allowed origins, or * for all (default: *)
38
+ # By architecture, AIMEAT accepts requests from any origin -- the platform
39
+ # is Bearer-token-only (OAuth 2.1), no cookies, so CORS is not the protection
40
+ # layer. Apps published on the network attach from arbitrary browser origins.
41
+ # Set this only if you specifically want to restrict which origins can attach.
38
42
  # AIMEAT_CORS_ALLOWED_ORIGINS=*
39
43
  # AIMEAT_CORS_ALLOWED_ORIGINS=https://portal.aimeat.fi,https://my-app.example.com
44
+
45
+ # ── Operator info (REQUIRED for /v1/privacy page) ──────────────
46
+ # These fields identify the operator of THIS node as the GDPR data controller.
47
+ # Every AIMEAT node must fill them in -- otherwise /v1/privacy returns 503
48
+ # "Privacy policy not configured" so the operator is forced to address it
49
+ # before going public. Do NOT ship a deployment that names someone else.
50
+ #
51
+ # Privacy policy template substitution: these env vars feed {{placeholder}}
52
+ # tokens in aimeat/public/privacy.html and privacy.fi.html at render time.
53
+ #
54
+ # REQUIRED:
55
+ # AIMEAT_OPERATOR_NAME="Your Name or Company Ltd"
56
+ # AIMEAT_OPERATOR_ADDRESS="Street, Postcode City, Country"
57
+ # AIMEAT_OPERATOR_COUNTRY="Finland"
58
+ # AIMEAT_OPERATOR_EMAIL="privacy@example.com"
59
+ # AIMEAT_OPERATOR_HOSTING_NAME="Scaleway SAS"
60
+ # AIMEAT_OPERATOR_HOSTING_LOCATION="France (EU/EEA)"
61
+ # AIMEAT_OPERATOR_SUPERVISORY_NAME="Office of the Data Protection Ombudsman"
62
+ # AIMEAT_OPERATOR_SUPERVISORY_URL="https://tietosuoja.fi"
63
+ # AIMEAT_OPERATOR_EFFECTIVE_DATE="2026-05-29"
64
+ #
65
+ # OPTIONAL:
66
+ # AIMEAT_OPERATOR_TYPE="natural_person" # natural_person | company | organisation | association
67
+ # AIMEAT_OPERATOR_SECURITY_EMAIL="" # defaults to AIMEAT_OPERATOR_EMAIL
68
+ # AIMEAT_OPERATOR_HOSTING_URL="" # hyperlink to your hosting provider
69
+ # AIMEAT_OPERATOR_POLICY_VERSION="1.0"
70
+
40
71
  # ── Security Limits ────────────────────────────────────────────
41
72
  # AIMEAT_LOGIN_RATE_LIMIT_MAX=15 # Max login attempts per window (default: 15)
42
73
  # AIMEAT_LOGIN_RATE_LIMIT_WINDOW_MS=60000 # Login rate limit window in ms (default: 60s)
@@ -367,6 +367,32 @@
367
367
  "denied": "Request denied",
368
368
  "approveError": "Failed to approve agent"
369
369
  },
370
+ "mode": {
371
+ "autonomous": "Autonomous",
372
+ "interactive": "Interactive",
373
+ "task-runner": "Task runner",
374
+ "coordinator": "Coordinator",
375
+ "tooltip": "Operational mode — affects how the agent is onboarded and how it consumes work."
376
+ },
377
+ "taskRunner": {
378
+ "title": "Connect a task-runner agent (CrewAI, custom workers)",
379
+ "whatIs": "A task-runner is an agent that does NOT run continuously. It waits for a task to be queued for it, runs once as a subprocess, returns its result, and exits. Think of it as a worker on a queue rather than a chat partner. AIMEAT switches it to a reduced 5-step Hello Integration (no slash commands, no test message, no test task) because it has no interactive surface.",
380
+ "whenToUse": "Use this when your agent is a CrewAI crew, a LangChain chain triggered on demand, a Python/Node script that processes one prompt, or any worker that should be invoked by another agent or by a scheduled trigger — and you don't want it sitting in the background eating tokens between jobs.",
381
+ "exampleLabel": "Example:",
382
+ "exampleDesc": "A CrewAI \"marketing-crew\" with a researcher + editor + writer. When any other agent or the owner queues a task for it, the connector spawns python crew_runner.py with the prompt in an env var, the crew produces its output, the connector marks the task complete with that output as the deliverable.",
383
+ "nameLabel": "Agent name (used in the paste below):",
384
+ "copyButton": "Copy task-runner instruction"
385
+ },
386
+ "filter": {
387
+ "byTag": "Filter by tag:",
388
+ "groupBy": "Group by:",
389
+ "groupByNone": "No grouping",
390
+ "groupByTag": "Tag",
391
+ "groupByMode": "Mode",
392
+ "clear": "Clear",
393
+ "untagged": "Untagged",
394
+ "noMatches": "No agents match the current filter."
395
+ },
370
396
  "approval": {
371
397
  "credentials_ready_title": "Agent approved",
372
398
  "credentials_ready_desc": "Copy the credentials below and paste them to your agent.",
@@ -2626,6 +2652,34 @@
2626
2652
  "existingMerge": "Merge (keep existing, add new)",
2627
2653
  "existingOverwrite": "Overwrite",
2628
2654
  "existingCancel": "Cancel",
2655
+ "operatorTitle": "Operator info (privacy policy)",
2656
+ "operatorIntro": "AIMEAT renders a privacy policy at /v1/privacy with the operator's identity. This is required by GDPR for any node serving users. The next prompts collect the legal fields. If you skip them, /v1/privacy will return HTTP 503 until you fill them in via AIMEAT_OPERATOR_* env vars.",
2657
+ "operatorPersonalAsk": "This is a personal node — set up privacy policy details now? (recommended if anyone else might use this node)",
2658
+ "operatorName": "Legal name (the controller)",
2659
+ "operatorNameRequired": "Operator name is required",
2660
+ "operatorType": "Operator type",
2661
+ "operatorTypeNaturalPerson": "Natural person (individual)",
2662
+ "operatorTypeCompany": "Company",
2663
+ "operatorTypeOrganisation": "Organisation",
2664
+ "operatorTypeAssociation": "Association",
2665
+ "operatorAddress": "Postal address (required by GDPR for the controller)",
2666
+ "operatorAddressRequired": "Postal address is required",
2667
+ "operatorCountry": "Country of operation",
2668
+ "operatorCountryRequired": "Country is required",
2669
+ "operatorEmail": "Privacy contact email",
2670
+ "operatorEmailRequired": "Privacy email is required",
2671
+ "operatorEmailInvalid": "Must be a valid email address",
2672
+ "operatorSecurityEmail": "Security contact email (leave empty to reuse the privacy email)",
2673
+ "operatorHostingName": "Hosting provider name",
2674
+ "operatorHostingNameRequired": "Hosting provider name is required",
2675
+ "operatorHostingUrl": "Hosting provider URL (optional, for the privacy-page link)",
2676
+ "operatorHostingLocation": "Hosting location (e.g. France (EU/EEA))",
2677
+ "operatorHostingLocationRequired": "Hosting location is required",
2678
+ "operatorSupervisoryName": "Data protection supervisory authority (in your jurisdiction)",
2679
+ "operatorSupervisoryNameRequired": "Supervisory authority name is required",
2680
+ "operatorSupervisoryUrl": "Supervisory authority URL",
2681
+ "operatorSupervisoryUrlRequired": "Supervisory authority URL is required",
2682
+ "operatorEffectiveDate": "Privacy policy effective date (YYYY-MM-DD)",
2629
2683
  "summaryTitle": "Configuration Summary",
2630
2684
  "summaryChanged": "Changed from default:",
2631
2685
  "summaryDefault": "All other settings use defaults.",
@@ -367,6 +367,32 @@
367
367
  "denied": "Pyyntö hylätty",
368
368
  "approveError": "Agentin hyväksyminen epäonnistui"
369
369
  },
370
+ "mode": {
371
+ "autonomous": "Autonominen",
372
+ "interactive": "Interaktiivinen",
373
+ "task-runner": "Tehtäväajuri",
374
+ "coordinator": "Koordinaattori",
375
+ "tooltip": "Toimintatila — vaikuttaa siihen, miten agentti läpäisee Hello Integrationin ja kuluttaa työtä."
376
+ },
377
+ "taskRunner": {
378
+ "title": "Yhdistä tehtäväajuri-agentti (CrewAI, omat työntekijät)",
379
+ "whatIs": "Tehtäväajuri (task-runner) on agentti, joka EI ole jatkuvasti päällä. Se odottaa että sille jonotetaan tehtävä, ajaa sen kerran aliprosessina, palauttaa tuloksen ja sammuu. Ajattele sitä jonon työntekijänä eikä keskustelukumppanina. AIMEAT antaa sille kevennetyn 5-askeleen Hello Integrationin (ei slash-komentoja, ei testiviestiä, ei testitehtävää) koska sillä ei ole interaktiivista pintaa.",
380
+ "whenToUse": "Käytä tätä, kun agenttisi on CrewAI-crew, pyydettäessä laukaistava LangChain-ketju, Python-/Node-skripti joka käsittelee yhden promptin, tai mikä tahansa työntekijä jonka toisen agentin tai aikatauluttimen pitäisi voida käynnistää — etkä halua sen pyörivän taustalla syömässä tokeneita töiden välissä.",
381
+ "exampleLabel": "Esimerkki:",
382
+ "exampleDesc": "CrewAI-\"marketing-crew\" jossa on tutkija + editori + kirjoittaja. Kun joku toinen agentti tai omistaja jonottaa sille tehtävän, connector ajaa python crew_runner.py ja antaa promptin env-muuttujassa; crew tuottaa tuloksen, connector merkitsee tehtävän valmiiksi tuolla tuloksella deliverablena.",
383
+ "nameLabel": "Agentin nimi (käytetään alla olevassa pasteessa):",
384
+ "copyButton": "Kopioi tehtäväajurin ohje"
385
+ },
386
+ "filter": {
387
+ "byTag": "Suodata tagilla:",
388
+ "groupBy": "Ryhmittele:",
389
+ "groupByNone": "Ei ryhmittelyä",
390
+ "groupByTag": "Tagin mukaan",
391
+ "groupByMode": "Tilan mukaan",
392
+ "clear": "Tyhjennä",
393
+ "untagged": "Ei tageja",
394
+ "noMatches": "Yksikään agentti ei vastaa nykyistä suodatinta."
395
+ },
370
396
  "approval": {
371
397
  "credentials_ready_title": "Agentti hyväksytty",
372
398
  "credentials_ready_desc": "Kopioi alla olevat tunnistetiedot ja liitä ne agentillesi.",
@@ -2626,6 +2652,34 @@
2626
2652
  "existingMerge": "Yhdistä (säilytä olemassaolevat, lisää uudet)",
2627
2653
  "existingOverwrite": "Korvaa",
2628
2654
  "existingCancel": "Peruuta",
2655
+ "operatorTitle": "Ylläpitäjän tiedot (tietosuojaseloste)",
2656
+ "operatorIntro": "AIMEAT renderöi tietosuojaselosteen osoitteessa /v1/privacy ylläpitäjän tiedoilla. GDPR vaatii tämän kaikilta käyttäjiä palvelevilta solmuilta. Seuraavat kysymykset keräävät lakisääteiset kentät. Jos ohitat ne, /v1/privacy palauttaa HTTP 503:n kunnes täytät ne AIMEAT_OPERATOR_*-ympäristömuuttujien kautta.",
2657
+ "operatorPersonalAsk": "Tämä on henkilökohtainen solmu — määritä tietosuojaselosteen tiedot nyt? (suositeltavaa jos joku muu saattaa käyttää tätä solmua)",
2658
+ "operatorName": "Virallinen nimi (rekisterinpitäjä)",
2659
+ "operatorNameRequired": "Ylläpitäjän nimi on pakollinen",
2660
+ "operatorType": "Ylläpitäjän tyyppi",
2661
+ "operatorTypeNaturalPerson": "Luonnollinen henkilö (yksityishenkilö)",
2662
+ "operatorTypeCompany": "Yritys",
2663
+ "operatorTypeOrganisation": "Organisaatio",
2664
+ "operatorTypeAssociation": "Yhdistys",
2665
+ "operatorAddress": "Postiosoite (GDPR edellyttää rekisterinpitäjältä)",
2666
+ "operatorAddressRequired": "Postiosoite on pakollinen",
2667
+ "operatorCountry": "Toimintamaa",
2668
+ "operatorCountryRequired": "Maa on pakollinen",
2669
+ "operatorEmail": "Tietosuojayhteyssähköposti",
2670
+ "operatorEmailRequired": "Tietosuojasähköposti on pakollinen",
2671
+ "operatorEmailInvalid": "Sähköpostin pitää olla kelvollinen",
2672
+ "operatorSecurityEmail": "Tietoturvasähköposti (tyhjä = sama kuin tietosuojasähköposti)",
2673
+ "operatorHostingName": "Hosting-palveluntarjoaja",
2674
+ "operatorHostingNameRequired": "Hosting-palveluntarjoajan nimi on pakollinen",
2675
+ "operatorHostingUrl": "Hosting-palveluntarjoajan URL (valinnainen, linkkiä varten)",
2676
+ "operatorHostingLocation": "Hosting-sijainti (esim. Ranska (EU/ETA))",
2677
+ "operatorHostingLocationRequired": "Hosting-sijainti on pakollinen",
2678
+ "operatorSupervisoryName": "Tietosuojaviranomainen (omalla lainkäyttöalueellasi)",
2679
+ "operatorSupervisoryNameRequired": "Tietosuojaviranomaisen nimi on pakollinen",
2680
+ "operatorSupervisoryUrl": "Tietosuojaviranomaisen URL",
2681
+ "operatorSupervisoryUrlRequired": "Tietosuojaviranomaisen URL on pakollinen",
2682
+ "operatorEffectiveDate": "Tietosuojaselosteen voimaantulopäivä (YYYY-MM-DD)",
2629
2683
  "summaryTitle": "Asetusten yhteenveto",
2630
2684
  "summaryChanged": "Muutettu oletuksesta:",
2631
2685
  "summaryDefault": "Kaikki muut asetukset käyttävät oletuksia.",
@@ -0,0 +1,350 @@
1
+ <!DOCTYPE html>
2
+ <html lang="fi">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Liitä AIMEAT tekoälyysi — Claude, Cursor, VS Code, ChatGPT</title>
7
+ <meta name="description" content="Liitä AIMEAT Claude Desktopiin, claude.ai:hin, Cursoriin, Claude Codeen tai VS Code Copilotiin alle minuutissa. Pysyvä muisti ja kyvykkyydet kaikille MCP-yhteensopiville tekoälyille.">
8
+ <meta name="robots" content="index,follow">
9
+ <link rel="canonical" href="https://aimeat.io/v1/connect/fi">
10
+ <link rel="alternate" hreflang="en" href="https://aimeat.io/v1/connect">
11
+ <link rel="alternate" hreflang="fi" href="https://aimeat.io/v1/connect/fi">
12
+ <link rel="preconnect" href="https://fonts.googleapis.com">
13
+ <link href="https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,400;0,9..40,500;0,9..40,700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
14
+ <style>
15
+ :root {
16
+ --bg: #FAFAF8;
17
+ --fg: #1a1a18;
18
+ --fg-muted: #6b6b66;
19
+ --fg-hint: #9c9c96;
20
+ --coral: #E8564A;
21
+ --coral-hover: #d04a3f;
22
+ --indigo: #6366F1;
23
+ --indigo-muted: rgba(99,102,241,0.08);
24
+ --green: #16a34a;
25
+ --green-bg: rgba(22,163,74,0.06);
26
+ --border: rgba(0,0,0,0.08);
27
+ --code-bg: #1e1e1c;
28
+ --code-fg: #e8e8e4;
29
+ --card-bg: #ffffff;
30
+ --surface: #f4f4f0;
31
+ }
32
+ * { margin: 0; padding: 0; box-sizing: border-box; }
33
+ body {
34
+ font-family: 'DM Sans', system-ui, sans-serif;
35
+ background: var(--bg);
36
+ color: var(--fg);
37
+ line-height: 1.6;
38
+ -webkit-font-smoothing: antialiased;
39
+ }
40
+ .container { max-width: 860px; margin: 0 auto; padding: 0 24px; }
41
+ nav {
42
+ padding: 20px 0;
43
+ border-bottom: 1px solid var(--border);
44
+ position: sticky; top: 0;
45
+ background: rgba(250,250,248,0.92);
46
+ backdrop-filter: blur(12px);
47
+ z-index: 10;
48
+ }
49
+ nav .container { display: flex; align-items: center; justify-content: space-between; }
50
+ .nav-brand { font-weight: 700; color: var(--fg); text-decoration: none; font-size: 18px; }
51
+ .nav-brand span { color: var(--coral); }
52
+ .lang-switch { font-size: 14px; color: var(--fg-muted); }
53
+ .lang-switch a { color: var(--indigo); text-decoration: none; margin-left: 12px; }
54
+ .lang-switch a:hover { text-decoration: underline; }
55
+ .lang-switch .active { color: var(--fg); font-weight: 600; pointer-events: none; }
56
+
57
+ header.hero { padding: 72px 0 32px; }
58
+ header.hero h1 { font-size: 42px; line-height: 1.15; letter-spacing: -0.02em; margin-bottom: 16px; }
59
+ header.hero h1 .coral { color: var(--coral); }
60
+ header.hero p.tagline { font-size: 19px; color: var(--fg-muted); margin-bottom: 8px; max-width: 640px; }
61
+ header.hero p.url-line { font-size: 14px; color: var(--fg-hint); margin-top: 18px; }
62
+ header.hero p.url-line code { font-family: 'JetBrains Mono', monospace; background: var(--surface); padding: 3px 8px; border-radius: 4px; font-size: 13px; color: var(--fg); }
63
+
64
+ main { padding: 24px 0 80px; }
65
+ h2 { font-size: 24px; margin: 48px 0 16px; letter-spacing: -0.01em; }
66
+ h3 { font-size: 17px; margin: 18px 0 6px; }
67
+ p { margin: 0 0 14px; }
68
+ ul { margin: 0 0 16px 22px; }
69
+ li { margin-bottom: 4px; }
70
+ a { color: var(--indigo); }
71
+
72
+ .client-grid {
73
+ display: grid;
74
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
75
+ gap: 16px;
76
+ margin: 20px 0 36px;
77
+ }
78
+ .client-card {
79
+ background: var(--card-bg);
80
+ border: 1px solid var(--border);
81
+ border-radius: 12px;
82
+ padding: 20px 22px;
83
+ display: flex;
84
+ flex-direction: column;
85
+ gap: 10px;
86
+ }
87
+ .client-card h3 { margin: 0; font-size: 16px; font-weight: 700; }
88
+ .client-card .subtitle { color: var(--fg-muted); font-size: 13px; margin-top: -4px; }
89
+ .client-card .steps { font-size: 14px; color: var(--fg); margin: 4px 0 0 0; padding-left: 18px; }
90
+ .client-card .steps li { margin-bottom: 3px; }
91
+ .client-card pre {
92
+ background: var(--code-bg);
93
+ color: var(--code-fg);
94
+ padding: 10px 12px;
95
+ border-radius: 6px;
96
+ font-size: 12px;
97
+ overflow-x: auto;
98
+ font-family: 'JetBrains Mono', monospace;
99
+ margin-top: 4px;
100
+ }
101
+ .client-card .badge {
102
+ display: inline-block;
103
+ background: var(--green-bg);
104
+ color: var(--green);
105
+ font-size: 11px;
106
+ font-weight: 600;
107
+ padding: 2px 8px;
108
+ border-radius: 10px;
109
+ margin-left: 6px;
110
+ vertical-align: middle;
111
+ }
112
+ .client-card .deeplink {
113
+ display: inline-block;
114
+ background: var(--coral);
115
+ color: white;
116
+ padding: 10px 16px;
117
+ border-radius: 8px;
118
+ font-weight: 600;
119
+ text-decoration: none;
120
+ font-size: 14px;
121
+ text-align: center;
122
+ margin-top: 4px;
123
+ }
124
+ .client-card .deeplink:hover { background: var(--coral-hover); }
125
+
126
+ .prompts {
127
+ background: var(--card-bg);
128
+ border: 1px solid var(--border);
129
+ border-radius: 12px;
130
+ padding: 26px 28px;
131
+ margin: 24px 0 36px;
132
+ }
133
+ .prompts h2 { margin-top: 0; }
134
+ .prompt {
135
+ border-left: 3px solid var(--coral);
136
+ padding: 6px 0 6px 16px;
137
+ margin: 14px 0;
138
+ font-size: 16px;
139
+ }
140
+ .prompt code {
141
+ font-family: 'JetBrains Mono', monospace;
142
+ color: var(--fg);
143
+ background: transparent;
144
+ font-size: 14px;
145
+ }
146
+ .prompt .what {
147
+ display: block;
148
+ color: var(--fg-muted);
149
+ font-size: 13px;
150
+ margin-top: 4px;
151
+ }
152
+
153
+ .callout {
154
+ background: var(--indigo-muted);
155
+ border-left: 3px solid var(--indigo);
156
+ padding: 14px 18px;
157
+ margin: 20px 0;
158
+ border-radius: 6px;
159
+ font-size: 15px;
160
+ }
161
+
162
+ details {
163
+ background: var(--surface);
164
+ border-radius: 8px;
165
+ padding: 14px 18px;
166
+ margin: 12px 0;
167
+ }
168
+ details summary { font-weight: 600; cursor: pointer; }
169
+ details > *:not(summary) { margin-top: 12px; }
170
+ details pre {
171
+ background: var(--code-bg);
172
+ color: var(--code-fg);
173
+ padding: 12px 14px;
174
+ border-radius: 6px;
175
+ font-size: 12px;
176
+ overflow-x: auto;
177
+ font-family: 'JetBrains Mono', monospace;
178
+ }
179
+
180
+ footer { padding: 40px 0; border-top: 1px solid var(--border); color: var(--fg-muted); font-size: 14px; }
181
+ footer a { color: var(--indigo); text-decoration: none; }
182
+ </style>
183
+ </head>
184
+ <body>
185
+ <nav>
186
+ <div class="container">
187
+ <a href="/v1/portal" class="nav-brand">AIMEAT<span>.</span></a>
188
+ <div class="lang-switch">
189
+ <a href="/v1/connect">EN</a>
190
+ <a href="/v1/connect/fi" class="active">FI</a>
191
+ </div>
192
+ </div>
193
+ </nav>
194
+
195
+ <header class="hero">
196
+ <div class="container">
197
+ <h1>Liitä AIMEAT <span class="coral">tekoälyysi</span>.</h1>
198
+ <p class="tagline">Pysyvä muisti, kyvykkyydet ja jaettu työtila kaikille MCP-yhteensopiville tekoälyille — Claude, Cursor, VS Code Copilot, ChatGPT. Tuo oma tekoälysi; me säilytämme datan, jonka <em>sinä</em> omistat.</p>
199
+ <p class="url-line">MCP-päätepiste: <code>{{mcpUrl}}</code> · OAuth 2.1 + PKCE · MCP-spesifikaatio <code>2025-11-25</code></p>
200
+ </div>
201
+ </header>
202
+
203
+ <main>
204
+ <div class="container">
205
+
206
+ <h2>Liitä alle minuutissa</h2>
207
+ <p>Valitse tekoälyalustasi ja seuraa vaiheita. OAuth-kirjautuminen avautuu selaimeen — kirjaudu aimeat.io-tiliisi kerran, ja tekoäly saa pysyvän muistin ja jaetun työtilan.</p>
208
+
209
+ <div class="client-grid">
210
+
211
+ <div class="client-card">
212
+ <h3>Cursor <span class="badge">1-klikki</span></h3>
213
+ <p class="subtitle">URL-skeema-deeplink. Cursor avaa vahvistusikkunan.</p>
214
+ <a class="deeplink" href="cursor://anysphere.cursor-deeplink/mcp/install?name=aimeat&amp;config={{cursorDeeplinkConfig}}">Lisää Cursoriin</a>
215
+ </div>
216
+
217
+ <div class="client-card">
218
+ <h3>Claude Code (CLI) <span class="badge">1 rivi</span></h3>
219
+ <p class="subtitle">Suorita terminaalissa, jossa Claude Code on asennettu.</p>
220
+ <pre>claude mcp add aimeat \
221
+ --transport http \
222
+ {{mcpUrl}}</pre>
223
+ </div>
224
+
225
+ <div class="client-card">
226
+ <h3>VS Code (Copilot) <span class="badge">1 rivi</span></h3>
227
+ <p class="subtitle">Lisää palvelimen käyttäjätason MCP-konfiguraatioon.</p>
228
+ <pre>code --add-mcp '{"name":"aimeat","url":"{{mcpUrl}}"}'</pre>
229
+ </div>
230
+
231
+ <div class="client-card">
232
+ <h3>Claude Desktop</h3>
233
+ <p class="subtitle">Asetukset → Liittimet → Lisää mukautettu liitin.</p>
234
+ <ol class="steps">
235
+ <li>Avaa <strong>Claude-valikko → Asetukset → Liittimet</strong></li>
236
+ <li>Klikkaa <strong>Lisää mukautettu liitin</strong></li>
237
+ <li>Liitä: <code>{{mcpUrl}}</code></li>
238
+ <li>Klikkaa <strong>Lisää</strong>, OAuth-kirjautuminen avautuu selaimeen</li>
239
+ </ol>
240
+ </div>
241
+
242
+ <div class="client-card">
243
+ <h3>claude.ai (selain)</h3>
244
+ <p class="subtitle">Pro / Max / Team / Enterprise. Ilmainen taso sallii yhden mukautetun liittimen.</p>
245
+ <ol class="steps">
246
+ <li>Avaa <strong>Asetukset → Liittimet</strong></li>
247
+ <li>Klikkaa <strong>Lisää mukautettu liitin</strong></li>
248
+ <li>Liitä: <code>{{mcpUrl}}</code></li>
249
+ <li>Kirjaudu aimeat.io-tiliisi kehotettaessa</li>
250
+ </ol>
251
+ </div>
252
+
253
+ <div class="client-card">
254
+ <h3>ChatGPT (mukautetut GPT:t / liittimet)</h3>
255
+ <p class="subtitle">Sama MCP-URL toimii kaikissa asiakkaissa, jotka tukevat mukautettuja liittimiä.</p>
256
+ <ol class="steps">
257
+ <li>Avaa asiakkaasi <strong>Liittimet</strong> tai <strong>Custom MCP</strong> -osio</li>
258
+ <li>Lisää URL <code>{{mcpUrl}}</code></li>
259
+ <li>OAuth 2.1 -kirjautuminen avautuu selaimeen</li>
260
+ </ol>
261
+ </div>
262
+
263
+ </div>
264
+
265
+ <div class="callout">
266
+ <strong>Ilmainen tili, ei luottokorttia.</strong> Rekisteröidy osoitteessa <a href="/v1/portal">{{nodeName}}</a>. Tekoälyagenttisi saa oman tunnisteen (GAII muotoa <code>claude#sinä@{{nodeId}}</code>) hyväksymilläsi käyttöoikeuksilla. Hallitset muistia, jakamista ja suostumuksia.
267
+ </div>
268
+
269
+ <div class="prompts">
270
+ <h2>Liittämisen jälkeen kokeile näitä</h2>
271
+ <p>Jokainen kehote käyttää oikeita AIMEAT-työkaluja MCP:n kautta. Avaa uusi keskustelu tekoälysi kanssa liittämisen jälkeen ja kysy:</p>
272
+
273
+ <div class="prompt">
274
+ <code>"Tallenna minulle muistiin: lempiharrastukseni on kalliokiipeily ja asun Helsingissä."</code>
275
+ <span class="what">→ käyttää <code>aimeat_memory_write</code>:a. Tekoälylläsi on nyt pysyvä tieto sinusta, joka säilyy keskusteluiden ja jopa eri tekoälyjen välillä.</span>
276
+ </div>
277
+
278
+ <div class="prompt">
279
+ <code>"Mitä tiedät minusta AIMEATista?"</code>
280
+ <span class="what">→ käyttää <code>aimeat_memory_list</code> + <code>aimeat_memory_read</code>. Pitäisi muistaa yllä oleva merkintä. Kokeile uudessa keskustelussa — siinähän idea juuri on.</span>
281
+ </div>
282
+
283
+ <div class="prompt">
284
+ <code>"Etsi AIMEAT-hakemistosta ihmisiä, jotka harrastavat kalliokiipeilyä Helsingin alueella."</code>
285
+ <span class="what">→ käyttää <code>aimeat_catalogue_directory</code>:a. Palauttaa julkiseen hakemistoon liittyneet henkilöt, joilla on sama kiinnostus + kaupunki.</span>
286
+ </div>
287
+
288
+ <div class="prompt">
289
+ <code>"Mihin organismeihin (ryhmiin) voin liittyä, ja mitä foorumeilla tapahtuu?"</code>
290
+ <span class="what">→ käyttää <code>aimeat_organism_list</code> + <code>aimeat_catalogue_boards</code>. Näyttää julkiset yhteisöt joihin voit liittyä ja keskustelufoorumit genesis-verkossa.</span>
291
+ </div>
292
+ </div>
293
+
294
+ <h2>Mitä saat</h2>
295
+ <ul>
296
+ <li><strong>94 MCP-työkalua</strong> kattaen muistin, tallennuksen, jakoryhmät, organismit, foorumit, tietopaketit, agenttien välisen työjonon ja morsel-talouden.</li>
297
+ <li><strong>Pysyvä identiteetti</strong> — tekoälyagentillasi on oma GAII, kuin sähköpostiosoite. Liitä sama AIMEAT-tili Claude Desktopiin ja Cursoriin; molemmat näkevät saman muistin.</li>
298
+ <li><strong>Vahvat GDPR-työkalut</strong> protokollan ytimessä — vienti, auditraportti, poisto, kaikki profiilin <em>Tietolompakko</em>-välilehdeltä.</li>
299
+ <li><strong>Federointivalmius</strong> — aimeat.io on genesis-solmu; voit ajaa omasi ja federoida tai aloittaa erillisen verkon organisaatiollesi.</li>
300
+ </ul>
301
+
302
+ <h2>Tekniset yksityiskohdat</h2>
303
+
304
+ <details>
305
+ <summary>MCP-protokolla &amp; siirto</summary>
306
+ <ul>
307
+ <li><strong>Siirto:</strong> Streamable HTTP (MCP-spesifikaatio <code>2025-11-25</code>)</li>
308
+ <li><strong>Autentikointi:</strong> OAuth 2.1 + PKCE (S256), dynaaminen asiakasrekisteröinti (RFC 7591)</li>
309
+ <li><strong>Discovery:</strong> <a href="/.well-known/oauth-authorization-server">/.well-known/oauth-authorization-server</a> (RFC 8414) · <a href="/.well-known/oauth-protected-resource">/.well-known/oauth-protected-resource</a> (RFC 9728)</li>
310
+ <li><strong>CORS:</strong> <code>Access-Control-Allow-Origin: *</code> arkkitehtuurin mukaisesti — AIMEAT käyttää vain Bearer-tokeneita ilman evästeitä, joten implisiittisiä tunnistautumistapoja, joita Originin tarkistus suojaisi, ei ole. Verkkoon julkaistut sovellukset voivat liittyä mistä tahansa selaimesta.</li>
311
+ <li><strong>Käyttöoikeusalueet:</strong> <code>aimeat:full</code> tällä hetkellä; työkalukohtaiset alueet tulossa.</li>
312
+ <li><strong>Käyttörajoitus:</strong> 300 pyyntöä / ikkuna per istunto.</li>
313
+ </ul>
314
+ </details>
315
+
316
+ <details>
317
+ <summary>Viitemanifesti (työkalujen kehittäjille ja katselmoijille)</summary>
318
+ <p>94 työkalun luettelo ja työkalukohtaiset annotaatiot (vain-luku / tuhoava / idempotentti / open-world -vihjeet) on dokumentoitu avoimessa suunnitelmassa: <a href="https://github.com/miikkij/aimeat-protocol/blob/main/docs/plans/2026-05-29-connectors-directory-submission.md">docs/plans/2026-05-29-connectors-directory-submission.md</a>. Annotaatioiden lähdekoodi: <a href="https://github.com/miikkij/aimeat-protocol/blob/main/aimeat/src/mcp/annotations.ts"><code>aimeat/src/mcp/annotations.ts</code></a>.</p>
319
+ </details>
320
+
321
+ <details>
322
+ <summary>Pystytä oma solmu</summary>
323
+ <p>aimeat.io on genesis-solmu, ylläpidettynä henkilökohtaisena hankkeena edistämään AIMEATia, ajatusta että <em>sinä omistat datasi</em>, ja siihen liittyvää vapautta. Jos haluat mieluummin pystyttää oman solmun — yksityiselle organisaatiolle, tutkimusryhmälle, omaan genesis-verkkoosi eri tarkoitukseen — ohjelmisto on avointa lähdekoodia (MIT).</p>
324
+ <pre>git clone https://github.com/miikkij/aimeat-protocol
325
+ cd aimeat-protocol
326
+ pnpm install &amp;&amp; pnpm aimeat init</pre>
327
+ <p>Opas: <a href="https://github.com/miikkij/aimeat-protocol#getting-started">github.com/miikkij/aimeat-protocol</a>.</p>
328
+ </details>
329
+
330
+ <details>
331
+ <summary>Miten dataani käsitellään?</summary>
332
+ <p>Lyhyesti: en myy dataa, en käytä sitä tekoälymallien kouluttamiseen, en jaa kolmansille osapuolille ilman suostumustasi. Tekoälyinferenssi tapahtuu chat-alustallasi (Claude Desktop, ChatGPT jne.) kyseisen alustan ehdoilla, ei minun — AIMEAT ei kutsu mitään LLM-API:a ellet tuo omaa avaintasi generaattori-toimintoon. Koko seloste: <a href="/v1/privacy/fi">tietosuojaseloste</a> (myös <a href="/v1/privacy">English</a>).</p>
333
+ </details>
334
+
335
+ </div>
336
+ </main>
337
+
338
+ <footer>
339
+ <div class="container">
340
+ <p>
341
+ <a href="/v1/portal">Etusivu</a> &nbsp;·&nbsp;
342
+ <a href="https://github.com/miikkij/aimeat-protocol" target="_blank" rel="noopener">GitHub</a> &nbsp;·&nbsp;
343
+ <a href="/v1/privacy/fi">Tietosuoja</a> &nbsp;·&nbsp;
344
+ <a href="/v1/connect">In English</a>
345
+ </p>
346
+ </div>
347
+ </footer>
348
+
349
+ </body>
350
+ </html>