Ava
Automatically share development progress to Slack through AI. MCP-powered task reporting with privacy-first design.
Installation
npx avaAsk AI about Ava
Powered by Claude · Grounded in docs
I know everything about Ava. Ask me about installation, configuration, usage, or troubleshooting.
0/500
Reviews
Documentation
Ava
Ava ã¯ã鲿ã®å ±æãããŒã ãšã®ã³ãã¥ãã±ãŒã·ã§ã³ãèŠæãªäººã§ããAI ãèªåã§å€éšåãšæ å ±å ±æãæäŒã£ãŠãããäžçãã€ãããããžã§ã¯ãã§ãã
äœæ¥ã«éäžããããŠé²æå ±åãå¿ããŠããŸããè©°ãŸã£ãŠããã®ã«ãªããªãçžè«ã§ããªãã宿çãªé²æç¢ºèªããŒãã£ã³ã°ã§ã³ãŒãã£ã³ã°ãäžæãããããããªæ©ã¿ã¯ãããŸãããïŒ
Ava ãã§ããããš
èªåã§é²æãSlackã«å ±å
Claude Code ã Cursor ãªã©ã® AI ã³ãŒãã£ã³ã°ãšãŒãžã§ã³ãã§äœæ¥ãé²ãããšãèªåçã« Slack ã®æå®ãã£ã³ãã«ã«é²æãæçš¿ãããŸãã
- ã¿ã¹ã¯éå§: äœã«åãçµã¿å§ããããå ±å
- é²ææŽæ°: äœæ¥ã®é²ã¿å ·åãéæå ±æ
- ããããã³ã°å ±å: å°ã£ãŠããããšãèªåã§çžè«
- äŒæ¢ã»åé: å¥ã¿ã¹ã¯åªå æãäžææã®ç¶æ³ãå ±æ
- å®äºå ±å: å®äºå 容ãå ±æ
ãã©ã€ãã·ãŒã«é æ ®ããèšèš
Slack ã«éãããã®ã¯ãæœè±¡çãªãµããªã®ã¿ã§ããã³ãŒãã®å šæãç§å¯éµãããŒã¯ã³ããšã©ãŒãã°ã®è©³çްã¯éä¿¡ãããŸãããéä¿¡ãããã®ã¯äœæ¥å 容ã®èŠçŽãããããã³ã°ã»äŒæ¢ã®çç±ã®æŠèŠãå®äºãµããªã®ã¿ã§ãã
èªåã§ã³ã³ãããŒã«ã§ããèªåå
ãã€å ±åããããã©ã®ç²åºŠã§è©±ãããäœãå ±æãããã¯èªç¶èšèªã§ã³ã³ãããŒã«ã§ããŸããå®å šã«èªååãããããŒã«ã§ã¯ãªããããã³ããæ¬¡ç¬¬ã§ã«ãŒãã³ãèªåã§ã³ã³ãããŒã«ããããšã§å®å¿æãåŸãããŸãã
ãã€ããŒãã©ãŒã«ã¹ã§ãå®å¿
éäžããŠäœæ¥ããŠãããšãã§ããAI ã代ããã«ããŒã ãšã³ãã¥ãã±ãŒã·ã§ã³ãåã£ãŠãããŸãããã€ã¯ããããžã¡ã³ããäžèŠã«ãªããä¿¡é Œé¢ä¿ãä¿ã¡ãªããéçºã«éäžã§ããŸãã
äž»ãªæ©èœ
MCP ãµãŒããŒ
Model Context Protocol (MCP) ã«å¯Ÿå¿ãã HTTP ãµãŒããŒã /mcp ãšã³ããã€ã³ãã§æäŸãAI Agents ããçŽæ¥ã¿ã¹ã¯ç®¡çãå¯èœã§ãã
å©çšå¯èœãªããŒã«:
start_task- ã¿ã¹ã¯ãéå§ã㊠Slack ã«éç¥update_task- é²æãæŽæ°ïŒããããã³ã°ã»äŒæ¢ãèªåè§£æ¶ïŒreport_blocked- ããããã³ã°ãå ±åpause_task- ã¿ã¹ã¯ãäžæäŒæ¢resume_task- äŒæ¢äžã®ã¿ã¹ã¯ãåécomplete_task- ã¿ã¹ã¯å®äºãš PR ãå ±ålist_tasks- ã¿ã¹ã¯äžèЧãååŸ
OAuth 2.1 + PKCE èªèšŒ
ã»ãã¥ã¢ãªèªèšŒãããŒã§ MCP ã¯ã©ã€ã¢ã³ããä¿è·ïŒ
- åçã¯ã©ã€ã¢ã³ãç»é² (
/api/oauth/register) - Authorization Code + PKCE ãã㌠(
/oauth/authorize) - ã¢ã¯ã»ã¹ããŒã¯ã³ç®¡ç (
/api/oauth/token) - Well-Known ã¡ã¿ããŒã¿ãšã³ããã€ã³ã
Slack çµ±å
ãŠãŒã¶ãŒèªèšŒ:
- Slack OpenID Connect ã§ã·ãŒã ã¬ã¹ãªãã°ã€ã³
- ã¯ãŒã¯ã¹ããŒã¹åäœã§ã®ãããã€ã³ã¹ããŒã«
ãªã¢ã«ã¿ã€ã éç¥:
- ã¿ã¹ã¯ããšã«å°çšã¹ã¬ãããäœæ
- éå§ã»é²æã»ããããã³ã°ã»äŒæ¢ã»åéã»å®äºããªã¢ã«ã¿ã€ã ã§æçš¿
- ã³ãŒããæ©å¯æ å ±ã¯éä¿¡ãããæœè±¡çãªãµããªã®ã¿
æ¥æ¬¡ã¬ããŒã:
/daily-reportã³ãã³ãã§ AI ã«ããæ¥æ¬¡ãµããªãçæ- å®è¡ãŠãŒã¶ãŒã®ã¿ã«è¡šç€ºããã ephemeral message
Stripe ãµãã¹ã¯ãªãã·ã§ã³
Terraform ã«ããæéãã©ã³ç®¡ç:
- Infrastructure as Code ã§æéãã©ã³ã管ç
- dev/prod ç°å¢ããšã«ç¬ç«ããèšå®
- lookup key ã䜿ã£ãæè»ãªäŸ¡æ Œç®¡ç
- Stripe ProviderïŒlukasaron/stripeïŒã䜿çš
ãµãã¹ã¯ãªãã·ã§ã³ API:
- ãã§ãã¯ã¢ãŠã (
POST /api/stripe/checkout): ãµãã¹ã¯ãªãã·ã§ã³è³Œå ¥ç»é¢ãžãªãã€ã¬ã¯ã - ããªã³ã°ããŒã¿ã« (
POST /api/stripe/portal-session): ãµãã¹ã¯ãªãã·ã§ã³ç®¡çç»é¢ãžãªãã€ã¬ã¯ã - ãµãã¹ã¯ãªãã·ã§ã³ååŸ (
GET /api/stripe/subscription): çŸåšã®ãµãã¹ã¯ãªãã·ã§ã³æ å ±ãååŸ
Webhook 察å¿:
customer.subscription.created/updated/deleted: ãµãã¹ã¯ãªãã·ã§ã³å€æŽã®èªååæcustomer.deleted: 顧客å逿ã®ããŒã¿ã¯ãªãŒã³ã¢ãã- çœ²åæ€èšŒã«ããã»ãã¥ã¢ãªéä¿¡
æéãã©ã³:
- Basic Plan: 500å/æ
- lookup key
basic_monthlyã§äŸ¡æ ŒãåçååŸ - èªåçšèšç®å¯Ÿå¿ïŒæ¥æ¬ïŒ
ããã·ã¥ããŒã
Web UI ã§ã¿ã¹ã¯ã®å¯èŠåïŒ
- é²è¡äžã»ããããã³ã°ã»äŒæ¢ã»å®äºã®ã¹ããŒã¿ã¹å¥è¡šç€º
- ã¿ã¹ã¯ã®è©³çް履æŽïŒæŽæ°ã»ããããã³ã°ã»äŒæ¢ã®èšé²ïŒ
- ããŒã å šäœã®äœæ¥ç¶æ³ãäžèЧã§ç¢ºèª
éçºè äœéš
- ã¯ã³ã¹ããããªã³ããŒãã£ã³ã°ïŒSlack 飿º â ãã£ã³ãã«éžæ â MCP èšå®ïŒ
.mcp.jsonèªåçæ- èªå·±çœ²åèšŒææžå¯Ÿå¿ã®éçºãµãŒããŒ
- TypeScript ãã«ãµããŒã
ã¢ãŒããã¯ãã£
Monorepo æ§æ
ãã®ãããžã§ã¯ã㯠pnpm workspace ã䜿çšãã monorepo æ§æã§ã:
ava/
âââ apps/
â âââ www/ # Next.js ã¢ããªã±ãŒã·ã§ã³ (MCP ãµãŒããŒãAPIãããã·ã¥ããŒã)
âââ packages/
â âââ database/ # Drizzle ORM ã¹ããŒããš DB ãŠãŒãã£ãªãã£
â âââ integrations/ # å€éšãµãŒãã¹é£æº (Slack, Stripe ãªã©)
âââ infra/ # Terraform ã«ãã Infrastructure as Code
ã·ã¹ãã ã¢ãŒããã¯ãã£
âââââââââââââââââââ
â AI Agents â
â (MCP Client) â
ââââââââââ¬âââââââââ
â HTTPS + OAuth 2.1
âŒ
âââââââââââââââââââââââââââââââââââââââââââââââââââ
â Ava (Next.js 16) â
â â
â ââââââââââââ ââââââââââââââ â
â â /mcp â â /api/* â â
â â (Hono) â â (Hono) â â
â ââââââââââââ ââââââââââââââ â
â â
â ââââââââââââââââââââââââââââââââ â
â â Next.js App Router â â
â â (Dashboard, Onboarding) â â
â ââââââââââââââââââââââââââââââââ â
â â
â ââââââââââââââââââââââââââââââââ â
â â OpenTelemetry â â
â â (instrumentation.ts) â â
â ââââââââââââââââââââââââââââââââ â
ââââââ¬ââââââââââââ¬ââââââââââââ¬ââââââââââââ¬âââââââââ
â â â â
⌠⌠⌠âŒ
ââââââââââââ ââââââââââââ ââââââââââââ ââââââââââââ
âPostgreSQLâ âSlack API â âStripe APIâ â Axiom â
â(Drizzle) â â(Bot,OIDC)â â(Payments)â â (Traces) â
ââââââââââââ ââââââââââââ ââââââââââââ ââââââââââââ
ã«ãŒãã£ã³ã°æ§æ:
/mcp- MCP ãµãŒããŒïŒHonoãåç¬ã«ãŒãïŒ/api/*- API ãšã³ããã€ã³ãïŒHonoãcatch-all ã«ãŒãïŒ/api/oauth/*- OAuth 2.1 èªå¯ãµãŒããŒ/api/auth/*- Slack OIDC èªèšŒ/api/slack/*- Slack 飿ºïŒãããã€ã³ã¹ããŒã«ãã³ãã³ãïŒ/api/stripe/*- Stripe ãµãã¹ã¯ãªãã·ã§ã³ïŒãã§ãã¯ã¢ãŠããããªã³ã°ããŒã¿ã«ãWebhookïŒ/api/health- ãã«ã¹ãã§ãã¯
- ãã®ä» - Next.js App RouterïŒããã·ã¥ããŒãããªã³ããŒãã£ã³ã°ïŒ
æè¡ã¹ã¿ãã¯
| ã«ããŽãª | æè¡ |
|---|---|
| ãã¬ãŒã ã¯ãŒã¯ | Next.js 16 (App Router), React 19 |
| API | Hono 4.10 |
| ããŒã¿ããŒã¹ | PostgreSQL + Drizzle ORM |
| èªèšŒ | Arctic (OAuth 2.1), Slack OpenID Connect |
| MCP | @hono/mcp, @modelcontextprotocol/sdk |
| AI | Vercel AI SDK + OpenAI |
| æ±ºæž | Stripe |
| Infrastructure | Terraform, Stripe Provider (lukasaron) |
| Observability | OpenTelemetry, Axiom |
| UI | Tailwind CSS v4, Radix UI, shadcn/ui |
| åå®å š | TypeScript 5, Zod |
| ãã¹ã | Vitest, Playwright |
| éçºããŒã« | pnpm, Lefthook, ESLint, Prettier |
åææ¡ä»¶
å¿ é
- Node.js 18+ (
corepack enable pnpmæšå¥š) - Docker & Docker Compose (PostgreSQL çš)
- Slack ã¢ã㪠- 以äžã®èšå®ã§äœæ:
Slack ã¢ããªã®èšå®
æ¹æ³ 1: App Manifest ã䜿çšïŒæšå¥šïŒ
-
Slack API ã§ãCreate New AppãâãFrom an app manifestããéžæ
-
ã¯ãŒã¯ã¹ããŒã¹ãéžæ
-
以äžã® App Manifest ã貌ãä»ãïŒ
<YOUR_BASE_URL>ãå®éã®ããŒã¹ URL ã«çœ®ãæããŠãã ããïŒ:
{
"display_information": {
"name": "Ava"
},
"features": {
"bot_user": {
"display_name": "Ava",
"always_online": false
},
"slash_commands": [
{
"command": "/daily-report",
"url": "https://<YOUR_BASE_URL>/api/slack/commands",
"description": "æ¬æ¥ã®ã¿ã¹ã¯ãµããªãçæ",
"usage_hint": "",
"should_escape": false
}
]
},
"oauth_config": {
"redirect_urls": [
"https://<YOUR_BASE_URL>/api/auth/slack/callback",
"https://<YOUR_BASE_URL>/api/slack/install/callback"
],
"scopes": {
"user": ["openid", "profile", "email"],
"bot": [
"chat:write",
"chat:write.public",
"channels:read",
"groups:read",
"commands"
]
}
},
"settings": {
"interactivity": {
"is_enabled": true,
"request_url": "https://<YOUR_BASE_URL>/api/slack/interactions"
},
"org_deploy_enabled": false,
"socket_mode_enabled": false,
"token_rotation_enabled": true
}
}
- App Credentials ãã
Client IDãClient SecretãSigning SecretãååŸ
æ¹æ³ 2: æåèšå®
-
Slack API ã§ãCreate New AppãâãFrom scratchããéžæ
-
OAuth & Permissions ã§ Bot Token Scopes ã远å :
chat:write- ã¡ãã»ãŒãžæçš¿chat:write.public- ãããªãã¯ãã£ã³ãã«ãžã®æçš¿channels:read- ãã£ã³ãã«äžèЧååŸgroups:read- ãã©ã€ããŒããã£ã³ãã«äžèЧååŸcommands- Slash Command å®è¡
-
OAuth & Permissions ã§ User Token Scopes ã远å :
openid- OpenID Connect èªèšŒprofile- ãããã£ãŒã«æ å ±ååŸemail- ã¡ãŒã«ã¢ãã¬ã¹ååŸ
-
OAuth & Permissions ã§ Redirect URLs ã远å :
https://<YOUR_BASE_URL>/api/auth/slack/callback https://<YOUR_BASE_URL>/api/slack/install/callback -
Slash Commands ã§
/daily-reportãäœæ:- Request URL:
https://<YOUR_BASE_URL>/api/slack/commands - Description:
æ¬æ¥ã®ã¿ã¹ã¯ãµããªãçæ
- Request URL:
-
App Credentials ãã
Client IDãClient SecretãSigning SecretãååŸ
- OpenAI API ã㌠- OpenAI Platform ã§ååŸ
- Stripe ã¢ã«ãŠã³ã - Stripe Dashboard ã§ã¢ã«ãŠã³ããäœæ
- ãã¹ãç°å¢ã§éçºããå Žåã¯ããã¹ãã¢ãŒãã® API ããŒãš Webhook ã·ãŒã¯ã¬ããã䜿çš
- Webhook ãšã³ããã€ã³ã:
https://<YOUR_BASE_URL>/api/stripe/webhook - Webhook ã€ãã³ã:
customer.subscription.created,customer.subscription.updated,customer.subscription.deleted,customer.deleted
ç°å¢å€æ°ã®èšå®
ãããžã§ã¯ãã«ãŒãã« .env ãã¡ã€ã«ãäœæããŠãã ããã.env.example ãåèã«ããŠãã ããïŒ
cp .env.example .env
ãã®åŸã以äžã®ç°å¢å€æ°ãèšå®ããŸãã
ç°å¢å€æ°ã®èª¬æ
| 倿°å | 説æ | å¿ é |
|---|---|---|
NEXT_PUBLIC_BASE_URL | ã¢ããªã±ãŒã·ã§ã³ã®ããŒã¹ URLãOAuth ã¡ã¿ããŒã¿ã Slack ãªãã€ã¬ã¯ã URL ã®æ§ç¯ã«äœ¿çš | Yes |
NEXT_PUBLIC_SITE_NAME | ãµã€ãåïŒããã©ã«ã: "Ava"ïŒ | No |
DATABASE_URL | PostgreSQL æ¥ç¶æåå | Yes |
SLACK_APP_CLIENT_ID | Slack ã¢ããªã® Client ID | Yes |
SLACK_APP_CLIENT_SECRET | Slack ã¢ããªã® Client Secret | Yes |
SLACK_SIGNING_SECRET | Slack ã¢ããªã® Signing SecretïŒSlash Command ã®çœ²åæ€èšŒã«äœ¿çšïŒ | Yes |
OPENAI_API_KEY | OpenAI API ããŒïŒæ¥æ¬¡ã¬ããŒãæ©èœã«äœ¿çšïŒ | Yes |
STRIPE_SECRET_KEY | Stripe API ããŒïŒãã¹ãç°å¢: sk_test_ãæ¬çªç°å¢: sk_live_ïŒ | Yes |
STRIPE_WEBHOOK_SECRET | Stripe Webhook 眲åã·ãŒã¯ã¬ããïŒWebhook ã€ãã³ãã®æ€èšŒã«äœ¿çšïŒ | Yes |
AXIOM_API_TOKEN | Axiom API ããŒã¯ã³ïŒOpenTelemetry ãã¬ãŒã¹ã®éä¿¡ã«äœ¿çšãæ¬çªç°å¢ã®ã¿ïŒ | No |
AXIOM_DATASET_NAME | Axiom ããŒã¿ã»ããåïŒOpenTelemetry ãã¬ãŒã¹ã®éä¿¡å ãæ¬çªç°å¢ã®ã¿ïŒ | No |
ããŒã«ã«éçº
# corepack ãæå¹å
$ npm run setup
# äŸåé¢ä¿ãã€ã³ã¹ããŒã«
$ pnpm install
# .env ãšããŠã³ããŒ
$ cp .env.example .env
.env ãã¡ã€ã«ã«ç°å¢å€æ°ãèšå®ããŠãã ããïŒåè¿°ã®ãç°å¢å€æ°ã®èšå®ããåç
§ïŒã
# PostgreSQL ã³ã³ãããèµ·å
$ pnpm db:up
# ãã€ã°ã¬ãŒã·ã§ã³ãå®è¡
$ pnpm db:migrate
# éçºãµãŒããŒãèµ·å
$ pnpm dev
ãµãŒããŒãèµ·åããããhttps://localhost:3000 ã«ã¢ã¯ã»ã¹ããŠãã ããã
Stripe Webhook ã®ããŒã«ã«ãã¹ã
Stripe CLI ã䜿çšããŠããŒã«ã«ç°å¢ã§ Webhook ããã¹ãã§ããŸãïŒ
# Stripe CLI ã§ããŒã«ã«ã« Webhook ã転é
$ pnpm dev:stripe
# å¥ã®ã¿ãŒããã«ã§éçºãµãŒããŒãèµ·å
$ pnpm dev
Stripe CLI ã STRIPE_WEBHOOK_SECRET ãèªåçæããã®ã§ã.env ãã¡ã€ã«ã«èšå®ããŠãã ããã
Terraform ã§æéãã©ã³ããããã€
# Stripe API ããŒãç°å¢å€æ°ã«èšå®
$ export TF_VAR_stripe_api_key=sk_test_xxxxx
# dev ç°å¢ã®å Žå
$ cd infra/enviroments/dev
# Terraform ãåæåïŒååã®ã¿ïŒ
$ ../../../infra/tf.sh init
# 倿Žå
容ã確èª
$ ../../../infra/tf.sh plan
# Stripe ã«ãããã€
$ ../../../infra/tf.sh apply
# Price ID ãªã©ã®åºåã確èª
$ ../../../infra/tf.sh output
泚æ: æ¬çªç°å¢ïŒinfra/enviroments/prodïŒã§ã¯ãæ¬çªçšã® API ããŒïŒsk_live_ïŒã䜿çšããŠãã ããã
Testing
Unit Test
$ pnpm test
$ pnpm test:watch
E2E Test
$ pnpm exec playwright install chrome
$ pnpm build
$ pnpm test:e2e
$ pnpm test:e2e:ui
Database
$ pnpm db:up # PostgreSQL ã³ã³ãããèµ·å
$ pnpm db:migrate # ãã€ã°ã¬ãŒã·ã§ã³ãå®è¡
$ pnpm db:studio # Drizzle Studio ãèµ·å
$ pnpm db:down # PostgreSQL ã³ã³ããã忢
ãªã³ããŒãã£ã³ã°ïŒååã»ããã¢ããïŒ
éçºãµãŒããŒèµ·ååŸã以äžã®æé ã§ Slack 飿ºãš MCP èšå®ãå®äºããŸãã
ã¹ããã 1: Slack ã§ãã°ã€ã³
- ãã©ãŠã¶ã§ https://localhost:3000 ã«ã¢ã¯ã»ã¹
- ãLogin with Slackããã¯ãªãã¯
- Slack ã®èªèšŒç»é¢ã§èš±å¯
ã¹ããã 2: Slack ã¯ãŒã¯ã¹ããŒã¹ã«ããããã€ã³ã¹ããŒã«
- ããã·ã¥ããŒãã§ãSlack 飿ºããŸãã¯
/slack/install/startã«ã¢ã¯ã»ã¹ - ããããã€ã³ã¹ããŒã«ããã¯ãŒã¯ã¹ããŒã¹ãéžæ
- å¿ èŠãªæš©éã確èªããŠãèš±å¯ããã
ã¹ããã 3: éç¥ãã£ã³ãã«ã®éžæ
/onboarding/connect-slackã«ã¢ã¯ã»ã¹- ã¿ã¹ã¯ã®é²æãæçš¿ãããã£ã³ãã«ãéžæ
- ãä¿åããã¯ãªãã¯
Note: åŸãã倿Žãããå Žåã¯
/settings/channelãã倿Žã§ããŸãã
ã¹ããã 4: MCP ã¯ã©ã€ã¢ã³ãã®èšå®
/onboarding/setup-mcpã«ã¢ã¯ã»ã¹- 衚瀺ãããèšå®ãã³ããŒ
Note: åŸããèšå®ã確èªãããå Žåã¯
/settingsãã確èªã§ããŸãã3. ãããžã§ã¯ãã«ãŒãã«.mcp.jsonãã¡ã€ã«ãäœæããŠè²Œãä»ã:
{
"mcpServers": {
"ava": {
"type": "http",
"url": "https://localhost:3000/mcp"
}
}
}
ã¹ããã 5: AI Agents ããæ¥ç¶
# èªå·±çœ²åèšŒææžãèš±å¯ã㊠AI Agent ãèµ·å
NODE_TLS_REJECT_UNAUTHORIZED=0 claude
ååæ¥ç¶æããã©ãŠã¶ã§ OAuth 2.1 ã®èªå¯ç»é¢ãéããŸãããèš±å¯ããã¯ãªãã¯ãããšãAI Agents ãã Ava ã® MCP ããŒã«ã䜿ããããã«ãªããŸãã
MCP ããŒã«ã®è©³çް
start_task
æ°ããã¿ã¹ã¯ãéå§ããŸãã
ãã©ã¡ãŒã¿:
issue.provider:"github"ãŸãã¯"manual"issue.id: GitHub Issue çªå·ïŒãªãã·ã§ã³ïŒissue.title: ã¿ã¹ã¯ã®ã¿ã€ãã«initial_summary: åæç¶æ³ã®èª¬æ
åäœ:
- ããŒã¿ããŒã¹ã«æ°ããã¿ã¹ã¯ã»ãã·ã§ã³ãäœæ
- Slack ã®éç¥ãã£ã³ãã«ã«æ°èŠã¹ã¬ãããäœæããéå§ã¡ãã»ãŒãžãæçš¿
- ã¹ã¬ããæ å ±ãä¿å
update_task
ã¿ã¹ã¯ã®é²æãæŽæ°ããŸãã
ãã©ã¡ãŒã¿:
task_session_id: ã¿ã¹ã¯ã»ãã·ã§ã³ IDsummary: 鲿ã®èŠçŽraw_context: 詳现ãªã³ã³ããã¹ãïŒDB ä¿åã®ã¿ãSlack ã«ã¯éä¿¡ãããªãïŒ
åäœ:
- ã¹ããŒã¿ã¹ã
in_progressã«æ»ã - æªè§£æ±ºã®ããããã³ã°ãäŒæ¢ãèªåçã«è§£æ¶
- Slack ã¹ã¬ããã«é²æãæçš¿
report_blocked
ã¿ã¹ã¯ã§ããããã³ã°ãçºçããããšãå ±åããŸãã
ãã©ã¡ãŒã¿:
task_session_id: ã¿ã¹ã¯ã»ãã·ã§ã³ IDreason: ããããã³ã°ã®çç±raw_context: 詳现ãªã³ã³ããã¹ãïŒãªãã·ã§ã³ïŒ
åäœ:
- ã¹ããŒã¿ã¹ã
blockedã«æŽæ° - Slack ã¹ã¬ããã«ããããã³ã°ãéç¥
pause_task
ã¿ã¹ã¯ãäžæäŒæ¢ããŸãã
ãã©ã¡ãŒã¿:
task_session_id: ã¿ã¹ã¯ã»ãã·ã§ã³ IDreason: äŒæ¢ã®çç±raw_context: 詳现ãªã³ã³ããã¹ãïŒãªãã·ã§ã³ïŒ
åäœ:
- ã¹ããŒã¿ã¹ã
pausedã«æŽæ° - Slack ã¹ã¬ããã«äŒæ¢ãéç¥
resume_task
äŒæ¢äžã®ã¿ã¹ã¯ãåéããŸãã
ãã©ã¡ãŒã¿:
task_session_id: ã¿ã¹ã¯ã»ãã·ã§ã³ IDsummary: åéæã®ç¶æ³raw_context: 詳现ãªã³ã³ããã¹ãïŒãªãã·ã§ã³ïŒ
åäœ:
- ã¹ããŒã¿ã¹ã
in_progressã«æ»ã - äŒæ¢ã¬ããŒãã«
resumed_atãèšé² - Slack ã¹ã¬ããã«åéãéç¥
complete_task
ã¿ã¹ã¯ãå®äºããŸãã
ãã©ã¡ãŒã¿:
task_session_id: ã¿ã¹ã¯ã»ãã·ã§ã³ IDsummary: å®äºãµããª
åäœ:
- ã¹ããŒã¿ã¹ã
completedã«æŽæ° - å®äºæ å ±ã upsert
- Slack ã¹ã¬ããã«å®äºãæçš¿
list_tasks
ã¿ã¹ã¯äžèЧãååŸããŸãã
ãã©ã¡ãŒã¿:
status: ã¹ããŒã¿ã¹ã§ãã£ã«ã¿ïŒin_progress,blocked,paused,completedïŒïŒãªãã·ã§ã³ïŒlimit: ååŸä»¶æ°ã®äžéïŒãªãã·ã§ã³ïŒ
æ»ãå€:
- èªèšŒãŠãŒã¶ãŒã®ã¿ã¹ã¯äžèŠ§ïŒæŽæ°æ¥æéé ïŒ
æ¥æ¬¡ã¬ããŒãæ©èœ
Slack ã§ /daily-report ã³ãã³ããå®è¡ãããšãAI ãæ¬æ¥ã®ã¿ã¹ã¯ãèŠçŽããŸãã
察象ã¿ã¹ã¯
- æ¬æ¥
completedã«ãªã£ãã¿ã¹ã¯ - æ¬æ¥æŽæ°ããã
in_progressãŸãã¯blockedã®ã¿ã¹ã¯
åäœ
- 察象ã¿ã¹ã¯ãããŒã¿ããŒã¹ããååŸ
- OpenAI API ã䜿çšããŠã¿ã¹ã¯ãèŠçŽ
- å®è¡ãããŠãŒã¶ãŒã®ã¿ã«è¡šç€ºããã ephemeral message ã§è¿ä¿¡
å¿ èŠæ¡ä»¶
OPENAI_API_KEYç°å¢å€æ°ã®èšå®- Slack ãããã®ã€ã³ã¹ããŒã«
ã»ãã¥ãªãã£ãšãã©ã€ãã·ãŒ
ããŒã¿ããŒã¹ã«ä¿åããããã®
- ãŠãŒã¶ãŒæ å ±ïŒSlack IDãã¡ãŒã«ã¢ãã¬ã¹ïŒ
- ã¯ãŒã¯ã¹ããŒã¹æ å ±ãš Bot ããŒã¯ã³
- ã¿ã¹ã¯ã»ãã·ã§ã³ãæŽæ°å±¥æŽãããããã³ã°å ±åãäŒæ¢å ±å
- OAuth ã¯ã©ã€ã¢ã³ãæ å ±ãèªå¯ã³ãŒããã¢ã¯ã»ã¹ããŒã¯ã³
Slack ã«éä¿¡ããããã®
- ã¿ã¹ã¯ã®æœè±¡çãªãµããªïŒéå§ã»é²æã»ããããã³ã°ã»äŒæ¢ã»å®äºïŒ
- ã¹ããŒã¿ã¹ã®å€æŽéç¥
Slack ã«éä¿¡ãããªããã®
- ã³ãŒãã®å šæãã¹ãããã
- ç§å¯éµãããŒã¯ã³ãç°å¢å€æ°
- çã®ãšã©ãŒãã°ãã¹ã¿ãã¯ãã¬ãŒã¹
- ãªããžããªã®æ©å¯æ å ±
raw_context ãã©ã¡ãŒã¿ã«æå®ãããããŒã¿ã¯ããŒã¿ããŒã¹ã«ã®ã¿ä¿åãããSlack ã«ã¯éä¿¡ãããŸããã
ãã©ãã«ã·ã¥ãŒãã£ã³ã°
AI Agents ããæ¥ç¶ã§ããªã
çç¶: MCP ã¯ã©ã€ã¢ã³ããã Ava ã«æ¥ç¶ã§ããªã
è§£æ±ºæ¹æ³:
- èªå·±çœ²åèšŒææžãèš±å¯ããŠèµ·å:
NODE_TLS_REJECT_UNAUTHORIZED=0 claude .mcp.jsonã® URL ãæ£ããã確èª- éçºãµãŒããŒãèµ·åããŠããã確èªïŒ
pnpm devïŒ
Slack éç¥ãå±ããªã
çç¶: ã¿ã¹ã¯ãéå§/æŽæ°ããŠã Slack ã«éç¥ãæ¥ãªã
è§£æ±ºæ¹æ³:
/settings/channelã§éç¥ãã£ã³ãã«ã®èšå®ã確èªã»å€æŽ- Slack ããããã¯ãŒã¯ã¹ããŒã¹ã«ã€ã³ã¹ããŒã«ãããŠããã
/settingsã§ç¢ºèª - ããããéç¥ãã£ã³ãã«ã«åå ããŠããã確èªïŒèªååå ã®ã¯ãïŒ
ããŒã¿ããŒã¹æ¥ç¶ãšã©ãŒ
çç¶: ECONNREFUSED ã database "ava" does not exist ãšã©ãŒ
è§£æ±ºæ¹æ³:
# ã³ã³ããã®ç¶æ
ã確èª
docker compose ps
# ã³ã³ãããåèµ·å
pnpm db:down
pnpm db:up
# ãã€ã°ã¬ãŒã·ã§ã³ãåå®è¡
pnpm db:migrate
/daily-report ãåããªã
çç¶: Slack ã§ /daily-report ãå®è¡ããŠããšã©ãŒãè¿ã
è§£æ±ºæ¹æ³:
OPENAI_API_KEYã.envã«èšå®ãããŠããã確èª- Slack ã¢ããªã® Slash Commands èšå®ã確èª
- Request URL ãæ£ããã確èª:
<BASE_URL>/api/slack/commands
ã³ã³ããªãã¥ãŒã·ã§ã³
ã³ã³ããªãã¥ãŒã·ã§ã³ãæè¿ããŸãïŒ
- ãã®ãªããžããªããã©ãŒã¯
- ãã£ãŒãã£ãŒãã©ã³ããäœæ (
git checkout -b feature/amazing-feature) - 倿Žãã³ããã (
git commit -m 'Add some amazing feature') - ãã©ã³ãã«ããã·ã¥ (
git push origin feature/amazing-feature) - Pull Request ãäœæ
詳现㯠CONTRIBUTING.md ãåç §ããŠãã ããã
ã©ã€ã»ã³ã¹
ãã®ãããžã§ã¯ã㯠MIT ã©ã€ã»ã³ã¹ã®äžã§å ¬éãããŠããŸãã詳现㯠LICENSE ãã¡ã€ã«ãåç §ããŠãã ããã
è¬èŸ
- Model Context Protocol - AI ãšããŒã«ãã€ãªãæšæºãããã³ã«
- Hono - 軜éã§é«é㪠Web ãã¬ãŒã ã¯ãŒã¯
- Next.js - React ãã¬ãŒã ã¯ãŒã¯
- Drizzle ORM - TypeScript ORM
