Кожны MCP-сервер — яшчэ адзін сакрэт, які агент можа ўпусціць
Кожны MCP-сервер — яшчэ адзін жывы сакрэт, і ён пашырае тое, да чаго можа дацягнуцца атручаны ўвод. Праверце скоупы токенаў і прымяніце чатыры выпраўленні, якія змяншаюць радыус паражэння.
Крыніцы: Every MCP Server You Add Gives Your Agent Another Credential
Усё пачатваецца нявінна. У паўтаку падключаецца GitHub, у втарок — Slack, потым Postgres, потым Notion, а ўвечары колега напісаў внутраній сервер для вырахунку рахунков, які так і не задокументаваў. Кожна дапамога робіць агента болей спроможным. Кожна з іх таксама дадае ўсё больш клучоў да кільця, якое ён носіць з сабой.
Проблемы часта выявляюцца аднойчы, калі хтось дэбагуе ўсё іншае і ачынае файл налашчэння. Шасць сервераў, шасць секрэтных даных, усе ў простым тэксце ў домашнім каталозе, без тэрміну заканчэння і без власніка. У такі момент MCP перастае выглядаць як зручны інструмент і пачынае выглядаць як абяранне.
Арыметыка
Пасля калькама месцаў энтузіазму тыповая налаштованасць выглядае так:
{
"mcpServers": {
"gh": { "cmd": "gh-mcp", "env": { "GH_TOKEN": "ghp_live_9f2a" } },
"db": { "cmd": "pg-mcp", "env": { "PG_URL": "postgres://app:hunter2@prod/main" } },
"sl": { "cmd": "slk-mcp", "env": { "SLACK_TOKEN": "xoxb-live-771" } }
}
}
Тры ўсёрверы, тры секрэты, адна файл і жадна замена. Вы можэце пераканацца ў стане свайго апарата за калькі секундаў, шукаючы ў стандартных папках настройкаў строкі, якія выглядаюць як токены.
grep -rIl "ghp_\|xoxb-\|sk-" ~/.config ~/.claude ~/Library 2>/dev/null | wc -l
Людзі, які ім яго керуюць, частаўка знаходзяць больш, чым спакушаліся. Колькасць ад аднацатаго, калі вы спакушаліся трох, не ўзначае нічога незвычайнага.
Тая частка, якая насправды заводзіць проблемы
Даныя, якія зберагаюцца на дыску, — гэта менш значныя аспекты проблемы. Больш серьёзным ёсць тое, што кожны з тых ключоў цяпер знаходзіцца пад керуваннем аднаго адпаведальнага за прыняцце рашэння, і гэты чалавек чытае тэксты з інтэрнэту.
one agent loop
|
+---------+---------+---------+---------+
| | | | |
github slack postgres notion billing
(14 scp) (9 scp) (rw all) (rw ws) (rw all)
| | | | |
+---------+---------+---------+---------+
|
one poisoned input
Коментар даўжынай з пытаннем, стораніца у Notion чыстае рэяд у таблыце — усе гэтыя элементы можаць прызначыць певную дзеянне, а агент распаўяе ўсе неабходныя засобы для яго адканання. Гэта ўсё тае ж проблема плутання адпаведальных аддзеўнікаў, толькі ў іншай форме. Агент не ўражаны; ён проста надае дапамогу і не можа адразніць вашыя інструкцыі ад тэксту, які лішэнь на відміну ад яных выглядае.
Анаіз разліку
Корыстны спосаб — за два тыдні фіксаваць кожны вызов інструмента, а пасля пораўняваць тое, што кожны токен можа робіць, з тым, што ён на самай працэ выканаў. Рэзультат ад такога аўдыту:
| Service | Granted Scopes | Scopes Used | Utilization |
| -------- | --------------: | ------------------: | ----------: |
| GitHub | 14 | 3 | 21.4% |
| Slack | 9 | 2 | 22.2% |
| Postgres | Full RW | 1 table, reads only | Minimal |
| Notion | Whole workspace | 2 pages | Minimal |
Прыгаючы чатыры пятыя з усіх наданых прав на доступ не былі выкарыстаны. Гэты прыгак — не проста незручнасць. Гэта рызык, які вы несеце, але за які нічога не отрымляеце.
Рашэнні, апранутыя па ўзнагародзе
Адна токен на сервер, прызначаная для конкрэтных задач таго сервера. Аднародныя токены означаюць аднародную адпаведнасць. Калі ўсё йдзе не так, журнал аўдыту павінен вказываць на сервер, а не на адну конкрэтную адзначку.
По замовчанню толькі чытанне для всіх элементаў, якія зберагаюць даны. Две лініі SQL, спецыяльная роля і права на чытанне табліц, якія агент дзеўальна чытае, дапамагаюць ператворыць найгоршы варыянт з выключэння табліцы на выцякванне запыту.
create role agent login password 'rotate_me';
grant usage on schema public to agent;
grant select on orders, users to agent;
Таксоны зь лімітавым трыманнем замест стацыярных. Нехай сховішча выдае атрыбуты на запіт, чыя трымкавасць складае калькі мінут. Секрэт, украдзены ў вёсеньні ранак, стае безцэнным ў вёсеньні апоўдні.
async function tok(srv) {
const r = await fetch(`${VAULT}/issue/${srv}`, { method: "POST" });
const { token, ttl } = await r.json();
return { token, exp: Date.now() + ttl * 1000 };
}
Фіксацыя толькі чату недастаткова — трэба таксама ліставаць вызывы. Невялікі кэшэўны слой, які фіксуе сервер, параметры і час вызыву для кожнай функцыі інструмента, складаецца з калькі ліній коду. У вышэўказанай аўдытцы было выявлена, што сервер вызываў канечную точку, пра якую ніхто яго не прасіў.
function wrap(name, fn) {
return async (args) => {
log({ srv: name, args, at: Date.now() });
return fn(args);
};
}
Правілле, якое трэба прыйняць
Перш чым запускаць сервер, уявіце яго як ворага і запытайцеся, што ён можа зробіць без жадной дапамогі. Калі чыстая адказва ўскладнюе справу, скорачыце правыя на доступ або воўсе не запускайце сервер. Не обяцвайце пасправіць гэта пазней, таму што «пазней» рэдка калі наступае, тым болей у пятніцу.
Усё гэта не ўзгляд проты MCP. Ён рашыў проблему інтэграцыі, якая прыводзіла агентыў да адчування, што яны — просто іграшкі. Сэрцэвы момант у тым, што кожны даданы сервер таксама додае крэдытнае паведамленне, і крэдытныя паведамленні заслуговуюць на тую ж атрыбутную адказнасць, якую вы паставілі б да будзь-каго іншага ключа, відпаведальнага за працу.
Супаўязаныя матэрыялы
- Практычныя прыемы: Ствароўчы агента для фінансавых задач на аснове сервера MCP ад EODHD — Паследовыя інструкцыі па вікорыстоўванні практычных прыемаў: Ствароўчы агента для фінансавых задач на аснове сервера MCP ад EODHD: контракты, перакрыцчы і месцы для дадзення коду для команд, якія розробляюць сістэмы MCP без яго.
- Практычныя прыемы: Чы можа ваш агент шукаць MCP-канцэнтры — Паследовыя інструкцыі па вікорыстоўванні практычных прыемаў: Чы можа ваш агент шукаць MCP-канцэнтры: контракты, перакрыцчы і месцы для дадзення коду для команд, якія рэалізуюць гэты патэрн.