Skip to content
Merged
Show file tree
Hide file tree
Changes from 82 commits
Commits
Show all changes
91 commits
Select commit Hold shift + click to select a range
4e797dd
chore: apply Rector to codeception fixture BundleCompilerPass
dotani1111 Jun 4, 2026
d0787f8
feat: MCP サーバ土台と商品/在庫 3 ツールを追加
dotani1111 Jun 4, 2026
0527b4c
test(mcp): 商品/在庫 3 Tool の DB 結合テスト
dotani1111 Jun 4, 2026
bf61603
fix(mcp): EntityArraySerializer の Doctrine Proxy 対応 + 深さデフォルトを 1 に
dotani1111 Jun 8, 2026
e708261
feat(mcp): 注文領域 3 ツールを追加 (search_orders / get_order / get_shipping)
dotani1111 Jun 8, 2026
2801d7a
feat(mcp): 顧客会員領域 3 ツールを追加 (search_customers / get_customer / get_cus…
dotani1111 Jun 8, 2026
28e78a0
feat(mcp): プラグイン管理 2 ツールを追加 (list_plugins / get_plugin)
dotani1111 Jun 8, 2026
4722657
fix(mcp): scope 不足を ToolCallException で返す
dotani1111 Jun 8, 2026
273096f
fix(mcp): Get 系 Tool の不在応答を {"found": false} に統一
dotani1111 Jun 8, 2026
80396f7
feat(mcp): IP / client_id 2 段の Rate Limiter を追加
dotani1111 Jun 8, 2026
7ed1f07
test(mcp): tools/list と allow_list の契約テストを追加
dotani1111 Jun 9, 2026
83cea02
feat(mcp): mcp チャネル直書きを禁止する PHPStan custom rule を追加
dotani1111 Jun 9, 2026
3cf35d6
test(mcp): MCP firewall が oauth2 経路を通ることを統合テスト化
dotani1111 Jun 9, 2026
03fc2c2
test(mcp): 失効 / Member 無効化で即 401 をテスト化 (AC #6 #9)
dotani1111 Jun 9, 2026
16e1b0f
test(mcp): Api44 install/enable で MCP 依存登録を担保 (AC #7)
dotani1111 Jun 9, 2026
2e1f316
refactor(mcp): scope 検査を中央 ReferenceHandler 層に集約 (設計案 A)
dotani1111 Jun 9, 2026
8dc4c9a
refactor(mcp): 監査ログの単一入口を alias 削除で保証 (PHPStan rule 撤去)
dotani1111 Jun 9, 2026
2ba2692
fix(mcp): Rate Limiter を cache 障害時 fail-closed にする
dotani1111 Jun 9, 2026
962cd6e
test(mcp): 正常 JWT 受理を 200 + JSON-RPC result で検証
dotani1111 Jun 9, 2026
9d73280
test(mcp): 全 Tool が McpToolScopeMap に scope を持つ契約テストを追加
dotani1111 Jun 10, 2026
80c89d4
fix(mcp): 監査ログ alias 削除の空振りを build 失敗で検出する
dotani1111 Jun 10, 2026
e319562
test(mcp): scope 強制の配線を回帰テストで担保
dotani1111 Jun 10, 2026
ac42582
fix(mcp): Rate Limiter の監査ログ失敗で拒否レスポンスを崩さない
dotani1111 Jun 10, 2026
3a4ca7e
fix(mcp): 監査ログ失敗時に default チャンネルへフォールバック記録する
dotani1111 Jun 10, 2026
92c7d03
test(mcp): 401 の WWW-Authenticate と経路を検証する
dotani1111 Jun 10, 2026
05f2d28
fix(mcp): 監査ログを専用ファイル mcp.log に分離する
dotani1111 Jun 11, 2026
eca5f3d
test(mcp): 監査ログが mcp.log に分離され site.log に漏れないことを担保
dotani1111 Jun 11, 2026
ddd1fd0
feat(mcp): 認証失敗(401)を mcp.log に記録する
dotani1111 Jun 11, 2026
c264a87
test(mcp): 認証失敗ログの reason 分岐 (ヘッダ有無) を検証
dotani1111 Jun 11, 2026
aca6597
Merge branch '4.4' into feature/poc-mcp
dotani1111 Jun 12, 2026
6b3b383
fix(mcp): 関連 Entity 要約の id 露出を allow_list で塞ぐ
dotani1111 Jun 14, 2026
05c29cf
fix(mcp): Tool の検索キーを正規化し日付書式を検証する
dotani1111 Jun 14, 2026
73228c8
fix(mcp): Tool 結果の data 契約違反を内部エラーとして扱う
dotani1111 Jun 14, 2026
2c610fe
test(mcp): 検索系テストを作成データの出現まで検証する
dotani1111 Jun 14, 2026
fa5fad4
style(mcp): 型注釈と重複する @param mixed $level を除去する
dotani1111 Jun 14, 2026
3ccae9a
fix(mcp): 本体を Api44/league クラスへのハード依存から切り離す
dotani1111 Jun 14, 2026
525091b
test(mcp): Api44 前提テストを mcp グループに分離し専用 CI ジョブで実走
dotani1111 Jun 14, 2026
1db2254
fix(ci): mcp ジョブの Api44 アーカイブを dist 展開可能な形式にする
dotani1111 Jun 14, 2026
ec85cd4
ci(mcp): Api44 を MCP firewall を含む feat/mcp-server-scorp で導入する
dotani1111 Jun 14, 2026
f0d801d
Merge branch '4.4' into feature/poc-mcp
dotani1111 Jun 15, 2026
324cbab
fix(mcp): 既定 lock を flock に固定し sysvsem 依存を外す
dotani1111 Jun 15, 2026
2cbe649
test(mcp): 401 の WWW-Authenticate に resource_metadata が載ることを縛る
dotani1111 Jun 30, 2026
feb8806
test(mcp): 401 の WWW-Authenticate を先頭一致で検証し resource_metadata 付与を許容する
dotani1111 Jun 30, 2026
8fd3932
fix(mcp): builder 不在時は scope 強制パスを早期 return する
dotani1111 Jun 30, 2026
dec195e
refactor(mcp): 早期 return 後の冗長な builder 存在チェックを除去
dotani1111 Jun 30, 2026
5155b41
feat(mcp): search_* をサマリ射影にしレスポンスを軽量化
dotani1111 Jul 8, 2026
15c4f26
feat(mcp): get_* の重い関連を id 要約へ縮退
dotani1111 Jul 8, 2026
eb6b44a
Merge branch '4.4' into feature/poc-mcp
dotani1111 Jul 9, 2026
f610f94
fix(mcp): McpSummaryFieldsTest の DataProvider 属性を rector ルールに合わせる
dotani1111 Jul 9, 2026
f2922d3
Merge branch '4.4' into feature/poc-mcp
dotani1111 Jul 9, 2026
1005a50
test(mcp): MCP サーバの Playwright E2E を追加
dotani1111 Jul 13, 2026
5ca7d54
fix(ci): MCP e2e ジョブを既存 playwright と同じ混成環境にする
dotani1111 Jul 13, 2026
13e0896
Merge branch '4.4' into feature/poc-mcp
dotani1111 Jul 13, 2026
6d8fe2e
fix(mcp): codeception 環境でも監査ログを site.log から分離する
dotani1111 Jul 14, 2026
ae5bfac
fix(mcp): get_customer_orders をサマリ射影にし customer scope からの明細露出を止める
dotani1111 Jul 14, 2026
58aa661
feat(mcp-cli): eccube:mcp:tools / eccube:mcp:call を追加
dotani1111 Jul 14, 2026
c9821a4
feat(mcp-cli): MCP ツールを per-tool の eccube:cli:* コマンドとして提供する
dotani1111 Jul 14, 2026
7cedb54
refactor(mcp-cli): 入力スキーマ解釈を ToolInputSchema VO に集約する
dotani1111 Jul 16, 2026
2714261
Merge remote-tracking branch 'upstream/4.4' into feature/mcp-cli-round2
dotani1111 Jul 16, 2026
4a39714
fix(mcp-cli): ToolInputSchema の properties を array|\stdClass 実型で受ける
dotani1111 Jul 16, 2026
81a1681
fix(mcp-cli): ToolInputSchema を final readonly class にする
dotani1111 Jul 16, 2026
ab03e47
fix(mcp): 監査ログ隔離契約テストを e2e env リネームに追従させる
dotani1111 Jul 16, 2026
4e11cbc
fix(ci): mcp e2e ジョブの APP_ENV を e2e env リネームに追従させる
dotani1111 Jul 16, 2026
183f4e4
fix(mcp-cli): boolean cast の不正値を失敗にし ToolInputSchema の読取を防御する
dotani1111 Jul 16, 2026
24949a1
test(mcp): ToolInputSchema / McpMarkdownFormatter の単体テストを追加する
dotani1111 Jul 16, 2026
48a3ae2
fix(mcp): search_products の解決不能な statusIds でフィルタ落ちを防ぐ
dotani1111 Jul 16, 2026
ca034b5
fix(mcp): Markdown 整形と型正規化の端ケースを堅牢化する
dotani1111 Jul 16, 2026
1d611c3
Merge remote-tracking branch 'upstream/4.4' into feature/mcp-cli-round2
dotani1111 Jul 16, 2026
d17d2d6
chore(mcp): framework.yaml と重複する lock.yaml を削除する
dotani1111 Jul 21, 2026
146b2ae
fix(mcp-cli): ツールの description をタグに渡し list/help での全コマンド実体化を防ぐ
dotani1111 Jul 21, 2026
c15af8d
test(mcp-cli): cast() の型変換分岐の単体テストを追加する
dotani1111 Jul 21, 2026
9b0b4bc
fix(mcp): 在庫絞り込みを EXISTS 部分クエリにし価格/在庫レンジの縮みを防ぐ
dotani1111 Jul 21, 2026
b8b97e9
fix(mcp): 会員・注文検索の解決不能 statusIds を 0 件にし注文番号を trim する
dotani1111 Jul 21, 2026
20c9339
test(mcp): 検索ツール修正の回帰テストを追加する
dotani1111 Jul 21, 2026
57a5678
fix(mcp): 許可リスト未設定時に prod では検証不能な Origin を拒否する
dotani1111 Jul 21, 2026
ba01755
test(mcp): クロス scope 拒否テストを customer/plugin に拡充する
dotani1111 Jul 21, 2026
887fce8
docs(mcp): /admin/mcp の認可境界と scope 検査の規約を追加する
dotani1111 Jul 21, 2026
175162b
test(mcp): mcp scope 無し token が /admin/mcp で 403 になることを縛る
dotani1111 Jul 21, 2026
43f00ec
test(mcp): 失効テストの有効 JWT に mcp read scope を付与する
dotani1111 Jul 21, 2026
43a3e3b
Merge upstream/4.4 into feature/mcp-cli-round2
dotani1111 Jul 28, 2026
de7f6d3
fix(test): 購入フローの service は文字列 ID で取得し rector skip を統合する
dotani1111 Jul 28, 2026
fad62d9
feat(mcp): tools/list を現トークンの scope で絞る
dotani1111 Jul 28, 2026
9dff975
chore(mcp): symfony/mcp-bundle 0.12 / mcp/sdk 0.7 へ更新
dotani1111 Jul 30, 2026
ac3dc83
Merge upstream/4.4 into feature/mcp-cli-round2
dotani1111 Jul 30, 2026
2782714
fix(mcp): search_products の在庫絞り込みを単一 EXISTS + 表示規格限定にする
dotani1111 Jul 30, 2026
0b8eff6
fix(test): 在庫テストの setStock を string 化し在庫比較を数値化する
dotani1111 Jul 30, 2026
053c2df
Merge upstream/4.4 into poc-mcp
dotani1111 Jul 31, 2026
4e71fb8
feat(mcp): MCP 機能の ON/OFF トグルを追加する(既定 OFF)
dotani1111 Jul 31, 2026
8f05cfc
test(e2e): MCP e2e 用に setup-fixtures で mcp_enabled を有効化する
dotani1111 Aug 3, 2026
6c59f1a
Merge upstream/4.4 into poc-mcp
dotani1111 Aug 6, 2026
7d7a895
fix(test): CustomerStatus::ACTIVE 撤去に追随し REGULAR で絞り込む
dotani1111 Aug 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
143 changes: 143 additions & 0 deletions .github/workflows/e2e-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -219,3 +219,146 @@ jobs:
with:
name: playwright-${{ matrix.suite }}-logs
path: var/log/

## MCP の Playwright E2E。 トークン発行 UI → Bearer で /admin/mcp にツール呼び出し、 の経路を通す。
## MCP は Api44 (OAuth2 / scope / firewall) 前提のため、 メインの playwright マトリクスとは別に、
## Api44 を導入した専用環境で mcp.spec.ts を実走する (Api44 導入手順は unit-test.yml の mcp ジョブと同じ)。
## 環境は既存 playwright ジョブと同じ混成 (.env=e2e / スキーマ・fixtures・Api44 導入は --env=dev)。
## ブラウザ経由の admin ログインが通る実績のある構成に合わせる。
mcp:
name: Playwright (mcp)
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6

## MCP の scope 認可と /admin/mcp 用 OAuth2 firewall は Api44 の feat/mcp-server-scorp に実装されており、
## eccube-api4 の 4.4 にはまだ無い。 当該ブランチが 4.4 にマージされたら ref を '4.4' に戻すこと。
- name: Checkout Api44 plugin
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
repository: 'EC-CUBE/eccube-api4'
ref: 'feat/mcp-server-scorp'
path: 'eccube-api4'
Comment thread
coderabbitai[bot] marked this conversation as resolved.

- name: Setup PostgreSQL
uses: ankane/setup-postgres@6d3ffa1aa7498a42b79e9f9f5838b99971839300 # v1
with:
postgres-version: '16'
user: postgres
- name: Configure PostgreSQL
run: |
for _ in $(seq 1 30); do pg_isready -h 127.0.0.1 && break; sleep 1; done
pg_isready -h 127.0.0.1 || { echo 'PostgreSQL did not become ready within 30s'; exit 1; }
psql -h 127.0.0.1 -U postgres -c "ALTER USER postgres PASSWORD 'password'"

- name: Setup PHP
uses: shivammathur/setup-php@7c071dfe9dc99bdf297fa79cb49ea005b9fcadbc # v2
with:
php-version: '8.3'
github-token: ''
extensions: :xdebug, redis

- name: Setup Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v4
with:
node-version: 20

- name: Initialize Composer
uses: ./.github/actions/composer

- name: Generate ECCUBE_AUTH_MAGIC
run: echo "ECCUBE_AUTH_MAGIC=$(openssl rand -hex 32)" >> "$GITHUB_ENV"

- name: Build Sass and JavaScript
run: |
npm ci
npm run build

- name: Setup mock-package-api
run: |
( cd eccube-api4 && tar cvzf "$GITHUB_WORKSPACE/Api44.tar.gz" ./* )
mkdir -p /tmp/repos
cp "$GITHUB_WORKSPACE/Api44.tar.gz" /tmp/repos/Api44.tgz
docker run --name package-api -d -v /tmp/repos:/repos -e MOCK_REPO_DIR=/repos -p 8080:8080 eccube/mock-package-api:composer2

# 既存 playwright ジョブと同じ混成: .env は e2e、 スキーマ/fixtures/Api44 導入は
# --env=dev で流す (ブラウザ経由 admin ログインが通る実績のある構成)。
- name: Setup EC-CUBE
env:
APP_ENV: 'e2e'
DATABASE_URL: postgres://postgres:password@127.0.0.1:5432/eccube_db
DATABASE_SERVER_VERSION: 16
ECCUBE_AUTH_MAGIC: ${{ env.ECCUBE_AUTH_MAGIC }}
run: |
echo "APP_ENV=${APP_ENV}" > .env
echo "TRUSTED_HOSTS=127.0.0.1,localhost" >> .env
echo "ECCUBE_AUTH_MAGIC=${ECCUBE_AUTH_MAGIC}" >> .env
bin/console doctrine:database:create --env=dev
bin/console doctrine:schema:create --env=dev
bin/console eccube:fixtures:load --env=dev

- name: Install Api44
env:
APP_ENV: 'dev'
DATABASE_URL: postgres://postgres:password@127.0.0.1:5432/eccube_db
DATABASE_SERVER_VERSION: 16
ECCUBE_PACKAGE_API_URL: 'http://127.0.0.1:8080'
USE_SELFSIGNED_SSL_CERTIFICATE: '1'
run: |
bin/console doctrine:query:sql "update dtb_base_info set authentication_key='dummy'" --env=dev
bin/console eccube:composer:require ec-cube/api44 --env=dev
bin/console eccube:plugin:enable --code=Api44 --env=dev
bin/console doctrine:schema:update --force --dump-sql --env=dev
bin/console cache:clear --no-warmup --env=dev
chmod 600 app/PluginData/Api44/oauth/private.key

- name: Install Playwright dependencies
working-directory: e2e
run: npm ci

- name: Install Playwright browsers
working-directory: e2e
run: npx playwright install --with-deps chromium

- name: Start PHP Development Server
env:
APP_ENV: 'e2e'
DATABASE_URL: postgres://postgres:password@127.0.0.1:5432/eccube_db
DATABASE_SERVER_VERSION: 16
ECCUBE_PACKAGE_API_URL: 'http://127.0.0.1:8080'
ECCUBE_AUTH_MAGIC: ${{ env.ECCUBE_AUTH_MAGIC }}
run: php -S 127.0.0.1:8000 codeception/router.php &

- name: Run Playwright tests
working-directory: e2e
env:
BASE_URL: 'http://127.0.0.1:8000'
DATABASE_URL: postgres://postgres:password@127.0.0.1:5432/eccube_db
ECCUBE_ADMIN_ROUTE: 'admin'
ADMIN_USER: 'admin'
ADMIN_PASSWORD: 'password'
APP_ENV: 'e2e'
CI: 'true'
run: npx playwright test --project=setup --project=mcp-tests mcp.spec.ts

- name: Upload Playwright report
if: failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: playwright-mcp-report
path: e2e/playwright-report/

- name: Upload ScreenShots
if: failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: playwright-mcp-results
path: e2e/test-results/

- name: Upload logs
if: failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: playwright-mcp-logs
path: var/log/
96 changes: 95 additions & 1 deletion .github/workflows/unit-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ jobs:
timeout_minutes: 10
max_attempts: 2
retry_on: error
command: vendor/bin/phpunit --exclude-group cache-clear --exclude-group cache-clear-install --exclude-group update-schema-doctrine --exclude-group plugin-service
command: vendor/bin/phpunit --exclude-group cache-clear --exclude-group cache-clear-install --exclude-group update-schema-doctrine --exclude-group plugin-service --exclude-group mcp
env:
APP_ENV: 'test'
DATABASE_URL: ${{ matrix.database_url }}
Expand Down Expand Up @@ -195,3 +195,97 @@ jobs:
echo "session.save_path=$PWD/var/sessions/test" > php.ini
echo "memory_limit=512M" >> php.ini
php -c php.ini vendor/bin/phpunit --group plugin-service

## MCP は Api44 (OAuth2 / scope / allow_list) が前提のため、 メインのマトリクスからは
## --exclude-group mcp で外し、 ここで Api44 を導入した専用環境で --group mcp を実走する。
## Api44 は packagist 非公開のため、 eccube-api4 を checkout → mock-package-api で配信して
## eccube:composer:require する (Api44 自身の CI と同じ方式)。
mcp:
name: PHPUnit (mcp)
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6

## MCP の scope 認可と /admin/mcp 用 OAuth2 firewall は Api44 の feat/mcp-server-scorp に実装されており、
## eccube-api4 の 4.4 にはまだ無い (このブランチに無いと firewall が prepend されず /admin/mcp が
## ログインへ 302 リダイレクトし、 McpFirewallContractTest 等が 401/200 を得られず失敗する)。
## 当該ブランチが 4.4 にマージされたら ref を '4.4' に戻すこと。
- name: Checkout Api44 plugin
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
repository: 'EC-CUBE/eccube-api4'
ref: 'feat/mcp-server-scorp'
path: 'eccube-api4'
Comment thread
dotani1111 marked this conversation as resolved.

- name: Setup PostgreSQL
uses: ankane/setup-postgres@6d3ffa1aa7498a42b79e9f9f5838b99971839300 # v1
with:
postgres-version: '16'
user: postgres
- name: Configure PostgreSQL
run: |
for _ in $(seq 1 30); do pg_isready -h 127.0.0.1 && break; sleep 1; done
pg_isready -h 127.0.0.1 || { echo 'PostgreSQL did not become ready within 30s'; exit 1; }
psql -h 127.0.0.1 -U postgres -c "ALTER USER postgres PASSWORD 'password'"

- name: Setup PHP
uses: shivammathur/setup-php@7c071dfe9dc99bdf297fa79cb49ea005b9fcadbc # v2
with:
php-version: '8.3'
github-token: ''
extensions: :xdebug, redis
- name: Initialize Composer
uses: ./.github/actions/composer

- name: Generate ECCUBE_AUTH_MAGIC
run: echo "ECCUBE_AUTH_MAGIC=$(openssl rand -hex 32)" >> $GITHUB_ENV

- name: Setup mock-package-api
run: |
# eccube-api4 自身の CI と同じ形式で固める (.git/.github 等の dotfiles を除外し ./* で固める)。
# .git を含めると composer の dist 展開が失敗する (Install of ec-cube/api44 failed)。
( cd eccube-api4 && tar cvzf "$GITHUB_WORKSPACE/Api44.tar.gz" ./* )
mkdir -p /tmp/repos
cp "$GITHUB_WORKSPACE/Api44.tar.gz" /tmp/repos/Api44.tgz
docker run --name package-api -d -v /tmp/repos:/repos -e MOCK_REPO_DIR=/repos -p 8080:8080 eccube/mock-package-api:composer2

- name: Setup EC-CUBE
env:
APP_ENV: 'test'
DATABASE_URL: postgres://postgres:password@127.0.0.1:5432/eccube_db
DATABASE_SERVER_VERSION: 16
DATABASE_CHARSET: utf8
ECCUBE_AUTH_MAGIC: ${{ env.ECCUBE_AUTH_MAGIC }}
run: |
bin/console doctrine:database:create
bin/console doctrine:schema:create
bin/console eccube:fixtures:load

- name: Install Api44
env:
APP_ENV: 'test'
DATABASE_URL: postgres://postgres:password@127.0.0.1:5432/eccube_db
DATABASE_SERVER_VERSION: 16
DATABASE_CHARSET: utf8
ECCUBE_PACKAGE_API_URL: 'http://127.0.0.1:8080'
USE_SELFSIGNED_SSL_CERTIFICATE: '1'
run: |
bin/console doctrine:query:sql "update dtb_base_info set authentication_key='dummy'"
bin/console eccube:composer:require ec-cube/api44
bin/console eccube:plugin:enable --code=Api44
bin/console doctrine:schema:update --force --dump-sql
bin/console cache:clear --no-warmup
chmod 600 app/PluginData/Api44/oauth/private.key

- name: PHPUnit (mcp)
env:
APP_ENV: 'test'
DATABASE_URL: postgres://postgres:password@127.0.0.1:5432/eccube_db
DATABASE_SERVER_VERSION: 16
DATABASE_CHARSET: utf8
MAILER_URL: 'smtp://127.0.0.11025'
run: |
echo "session.save_path=$PWD/var/sessions/test" > php.ini
echo "memory_limit=512M" >> php.ini
php -c php.ini vendor/bin/phpunit --group mcp
1 change: 1 addition & 0 deletions app/config/eccube/bundles.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,5 @@
DAMA\DoctrineTestBundle\DAMADoctrineTestBundle::class => ['test' => true],
Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true],
Eccube\EccubeBundle::class => ['all' => true],
Symfony\AI\McpBundle\McpBundle::class => ['all' => true],
];
3 changes: 2 additions & 1 deletion app/config/eccube/packages/dev/monolog.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ monolog:
level: debug
formatter: eccube.log.formatter.line
max_files: 10
channels: ['!cookie_consent']
# mcp は専用ハンドラ (mcp)、 cookie_consent は専用ハンドラに出すため main(site.log) から除外する
channels: ['!mcp', '!cookie_consent']
# Cookie consent: 同意操作の証跡を info レベルで専用ファイルへ直接出力する。
cookie_consent:
type: rotating_file
Expand Down
3 changes: 2 additions & 1 deletion app/config/eccube/packages/e2e/monolog.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ monolog:
level: debug
formatter: eccube.log.formatter.line
max_files: 10
channels: ['!cookie_consent']
# mcp は専用ハンドラ (mcp)、 cookie_consent は専用ハンドラに出すため main(site.log) から除外する
channels: ['!cookie_consent', '!mcp']
# Cookie consent: 同意操作の証跡を info レベルで専用ファイルへ直接出力する。
cookie_consent:
type: rotating_file
Expand Down
10 changes: 10 additions & 0 deletions app/config/eccube/packages/http_discovery.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
services:
Psr\Http\Message\RequestFactoryInterface: '@http_discovery.psr17_factory'
Psr\Http\Message\ResponseFactoryInterface: '@http_discovery.psr17_factory'
Psr\Http\Message\ServerRequestFactoryInterface: '@http_discovery.psr17_factory'
Psr\Http\Message\StreamFactoryInterface: '@http_discovery.psr17_factory'
Psr\Http\Message\UploadedFileFactoryInterface: '@http_discovery.psr17_factory'
Psr\Http\Message\UriFactoryInterface: '@http_discovery.psr17_factory'

http_discovery.psr17_factory:
class: Http\Discovery\Psr17Factory
14 changes: 14 additions & 0 deletions app/config/eccube/packages/mcp.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
mcp:
app: 'EC-CUBE MCP Server'
version: '4.4.0'
description: 'EC-CUBE 4.4 の管理データ (商品/在庫・注文・顧客会員・プラグイン管理) を AI クライアントから自然言語で参照する読み取り専用 MCP サーバ。 認証認可は API プラグイン (api44) の OAuth2 / scope に委譲する。'
client_transports:
http: true
stdio: true
http:
path: '/%eccube_admin_route%/mcp'
session:
store: file
discovery:
scan_dirs:
- src/Eccube/Service/Mcp/Tool
19 changes: 19 additions & 0 deletions app/config/eccube/packages/mcp_rate_limiter.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# MCP サーバの Rate Limiter 設定 (設計 §5「Rate Limiter 連携」)。
#
# 2 段構成:
# - mcp_ip: リモート IP 単位の制限 (firewall 前で消費、 認証エラー連発攻撃にも効く)
# - mcp_client: OAuth2 client_id 単位の制限 (firewall 通過後の OAuth2Token から client_id を取得して消費)
#
# 既定値は PoC レベルの控えめな値。 GA 運用開始時に再評価する。
framework:
rate_limiter:
mcp_ip:
policy: fixed_window
limit: 60
interval: '1 minute'
cache_pool: rate_limiter.cache
mcp_client:
policy: fixed_window
limit: 300
interval: '1 minute'
cache_pool: rate_limiter.cache
14 changes: 13 additions & 1 deletion app/config/eccube/packages/monolog.yml
Original file line number Diff line number Diff line change
@@ -1,2 +1,14 @@
monolog:
channels: ['front', 'admin', 'cookie_consent']
channels: ['front', 'admin', 'mcp', 'cookie_consent']
handlers:
# MCP 監査ログ: PII を含み得るため site.log と分離した専用ファイルに、 1 レコード 1 JSON で出力する。
# fingers_crossed を挟まず info から常時書き出す (監査記録は error 連動で握り潰してはならない)。
# 保管日数は ECCUBE_MCP_LOG_RETENTION_DAYS (既定 90)。 ファイルは所有者/グループのみ読める権限にする。
mcp:
type: rotating_file
path: '%kernel.logs_dir%/%kernel.environment%/mcp.log'
channels: ['mcp']
level: info
formatter: eccube.mcp.log.formatter.json
max_files: '%env(int:ECCUBE_MCP_LOG_RETENTION_DAYS)%'
file_permission: 0640
3 changes: 2 additions & 1 deletion app/config/eccube/packages/prod/monolog.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ monolog:
handler: main_rotating_file
excluded_http_codes: [404, 405]
buffer_size: 50
channels: ['!doctrine', '!event', '!php', '!cookie_consent']
# mcp / cookie_consent は専用ハンドラに出すため main(site.log) からは除外する
channels: ['!doctrine', '!event', '!php', '!mcp', '!cookie_consent']
main_rotating_file:
type: rotating_file
max_files: 60
Expand Down
3 changes: 3 additions & 0 deletions app/config/eccube/routes.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ controllers:
customize_controllers:
resource: ../../../app/Customize/Controller
type: attribute
mcp:
resource: .
type: mcp

# prefix: /{_locale}
# prefix: /
Expand Down
Loading
Loading