# コントリビューションガイド
このプロジェクトへの貢献をありがとうございます!
## 開発環境のセットアップ
### 必要条件
- Node.js 20.x 以上
- pnpm 8.x 以上
### 初期セットアップ
```bash
git clone <repository-url>
cd company-mcp
pnpm install
```
### ビルド
```bash
pnpm build
```
### 開発モード
```bash
pnpm dev
```
## 新しいツールの追加
### 1. バリデーションスキーマの追加
`packages/core/src/validation.ts` に Zod スキーマを追加:
```typescript
export const NewToolSchema = z.object({
param1: z.string().min(1),
param2: z.number().optional(),
});
export type NewTool = z.infer<typeof NewToolSchema>;
```
### 2. ツール実装の作成
`apps/mcp-server-google/src/tools/` に新しいファイルを作成:
```typescript
import {
getLogger,
validateInput,
NewToolSchema,
GoogleAPIError,
withErrorHandling,
type NewTool,
} from '@company-mcp/core';
const logger = getLogger();
export async function newTool(input: unknown): Promise<Result> {
return withErrorHandling('new_tool', async () => {
const validation = validateInput(NewToolSchema, input);
if (!validation.success) {
throw new GoogleAPIError(validation.errors.join(', '), 400);
}
const params = validation.data as NewTool;
const startTime = Date.now();
// 実装...
logger.audit('new_tool', 'action', {
args: { param1: params.param1 },
result: 'success',
duration_ms: Date.now() - startTime,
});
return result;
});
}
export const newTools = [
{
name: 'new_tool',
description: 'Description of what this tool does.',
inputSchema: {
type: 'object',
properties: {
param1: {
type: 'string',
description: 'Description of param1',
},
param2: {
type: 'number',
description: 'Description of param2',
},
},
required: ['param1'],
},
},
];
export const newHandlers = {
new_tool: newTool,
};
```
### 3. tools/index.ts に追加
```typescript
export { newTools, newHandlers } from './new.js';
// allTools と allHandlers にも追加
```
### 4. テストの追加
`apps/mcp-server-google/tests/` にテストファイルを作成。
## コーディング規約
### TypeScript
- 厳密な型付けを使用(`any` は避ける)
- 明示的な戻り値の型を推奨
- ESLint ルールに従う
### エラーハンドリング
- `withErrorHandling` ラッパーを使用
- Google API エラーは `GoogleAPIError.fromGoogleError` で変換
- ユーザーフレンドリーなエラーメッセージ
### ロギング
- 全ての操作で `logger.audit` を使用
- 機密情報はマスク(config の `maskSensitiveFields` 参照)
- duration_ms を計測
### セキュリティ
- 破壊的操作は `isOperationAllowed` でゲート
- フォルダ操作は `isFolderAllowed` でチェック
- デフォルトは安全側に(readonly, dry-run)
## Pull Request
### ブランチ命名
- `feature/xxx` - 新機能
- `fix/xxx` - バグ修正
- `docs/xxx` - ドキュメント
### コミットメッセージ
```
type(scope): subject
body (optional)
```
Types: `feat`, `fix`, `docs`, `style`, `refactor`, `test`, `chore`
### チェックリスト
- [ ] `pnpm lint` がパス
- [ ] `pnpm typecheck` がパス
- [ ] `pnpm test` がパス
- [ ] ドキュメントを更新(必要な場合)
- [ ] CHANGELOG.md を更新(必要な場合)
## リリース
1. バージョンを更新
2. CHANGELOG.md を更新
3. タグを作成
4. GitHub Release を作成
## 質問・問題
Issue を作成してください。