attention-manifest-protocol 0.4.2 → 0.4.3
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.
- package/CHANGELOG.md +341 -293
- package/CHANGELOG.zh-CN.md +41 -8
- package/README.md +250 -171
- package/README.zh-CN.md +251 -171
- package/lib/assignment/assign.d.ts +102 -0
- package/lib/assignment/assign.js +556 -0
- package/lib/assignment/binding.d.ts +103 -0
- package/lib/assignment/binding.js +575 -0
- package/lib/assignment/errors.d.ts +14 -0
- package/lib/assignment/errors.js +16 -0
- package/lib/assignment/guards.d.ts +18 -0
- package/lib/assignment/guards.js +28 -0
- package/lib/assignment/index.d.ts +10 -0
- package/lib/assignment/index.js +10 -0
- package/lib/assignment/types.d.ts +169 -0
- package/lib/assignment/types.js +1 -0
- package/lib/attention/budget.d.ts +1 -1
- package/lib/attention/budget.js +31 -9
- package/lib/bayes/engine.js +2 -1
- package/lib/bayes/reliability.js +25 -10
- package/lib/boundary/frame.d.ts +10 -4
- package/lib/boundary/frame.js +346 -109
- package/lib/boundary/kinds.d.ts +11 -0
- package/lib/boundary/kinds.js +33 -0
- package/lib/boundary/refTable.d.ts +19 -9
- package/lib/boundary/refTable.js +128 -30
- package/lib/boundary/toolCall.d.ts +22 -10
- package/lib/boundary/toolCall.js +798 -97
- package/lib/concept/conceptBudget.js +10 -1
- package/lib/concurrency/idempotency.d.ts +4 -3
- package/lib/concurrency/idempotency.js +57 -13
- package/lib/concurrency/retry.js +18 -3
- package/lib/context/agentContext.d.ts +13 -0
- package/lib/context/agentContext.js +14 -1
- package/lib/context/ast.d.ts +4 -1
- package/lib/context/ast.js +13 -3
- package/lib/context/contentStore.js +22 -9
- package/lib/context/contextBuilder.d.ts +457 -0
- package/lib/context/contextBuilder.js +1395 -0
- package/lib/context/contextPackage.d.ts +214 -0
- package/lib/context/contextPackage.js +191 -0
- package/lib/context/index.d.ts +14 -3
- package/lib/context/index.js +9 -1
- package/lib/context/relevance.d.ts +171 -0
- package/lib/context/relevance.js +250 -0
- package/lib/context/workspaceDiff.d.ts +105 -0
- package/lib/context/workspaceDiff.js +238 -0
- package/lib/context/workspaceService.d.ts +236 -1
- package/lib/context/workspaceService.js +1501 -73
- package/lib/cooperation/collaboration.d.ts +9 -0
- package/lib/cooperation/session.d.ts +4 -4
- package/lib/cooperation/session.js +3 -3
- package/lib/database/adapter/filesystemStore.d.ts +145 -0
- package/lib/database/adapter/filesystemStore.js +321 -0
- package/lib/database/adapter/index.d.ts +2 -0
- package/lib/database/adapter/index.js +2 -0
- package/lib/database/adapter/workspaceSessionStore.d.ts +118 -0
- package/lib/database/adapter/workspaceSessionStore.js +120 -0
- package/lib/database/entity/fileGraph.d.ts +53 -0
- package/lib/database/entity/fileGraph.js +15 -0
- package/lib/database/entity/fileTree.d.ts +76 -0
- package/lib/database/entity/fileTree.js +39 -0
- package/lib/database/entity/hook.d.ts +29 -0
- package/lib/database/entity/hook.js +18 -0
- package/lib/database/entity/index.d.ts +4 -0
- package/lib/database/entity/index.js +4 -0
- package/lib/database/entity/workspaceSession.d.ts +53 -0
- package/lib/database/entity/workspaceSession.js +28 -0
- package/lib/database/repository/fileAnnotationRepository.d.ts +75 -0
- package/lib/database/repository/fileAnnotationRepository.js +109 -0
- package/lib/database/repository/fileGraphRepository.d.ts +188 -0
- package/lib/database/repository/fileGraphRepository.js +648 -0
- package/lib/database/repository/fileNodeRepository.d.ts +116 -0
- package/lib/database/repository/fileNodeRepository.js +263 -0
- package/lib/database/repository/fileOutlineRepository.d.ts +40 -0
- package/lib/database/repository/fileOutlineRepository.js +104 -0
- package/lib/database/repository/fileWriteRepository.d.ts +41 -0
- package/lib/database/repository/fileWriteRepository.js +93 -0
- package/lib/database/repository/hookRepository.d.ts +67 -0
- package/lib/database/repository/hookRepository.js +150 -0
- package/lib/database/repository/index.d.ts +7 -0
- package/lib/database/repository/index.js +7 -0
- package/lib/database/repository/workspaceSessionRepository.d.ts +134 -0
- package/lib/database/repository/workspaceSessionRepository.js +327 -0
- package/lib/database/service/database.d.ts +14 -0
- package/lib/database/service/database.js +21 -0
- package/lib/database/sql/schema.js +187 -0
- package/lib/database/store/database.js +6 -1
- package/lib/delegate/team.d.ts +5 -0
- package/lib/delegate/team.js +83 -20
- package/lib/discover/classify.d.ts +20 -0
- package/lib/discover/classify.js +85 -0
- package/lib/discover/host.d.ts +20 -0
- package/lib/discover/host.js +89 -0
- package/lib/discover/index.d.ts +11 -0
- package/lib/discover/index.js +11 -0
- package/lib/discover/kinds.d.ts +14 -0
- package/lib/discover/kinds.js +23 -0
- package/lib/discover/tree.d.ts +7 -0
- package/lib/discover/tree.js +432 -0
- package/lib/discover/types.d.ts +115 -0
- package/lib/discover/types.js +1 -0
- package/lib/error/boundaryRejection.d.ts +1 -1
- package/lib/evaluation/agreement.js +2 -2
- package/lib/execution/handles.js +6 -0
- package/lib/execution/pin.js +2 -2
- package/lib/file/cfb.d.ts +56 -0
- package/lib/file/cfb.js +396 -0
- package/lib/file/dependency.d.ts +151 -0
- package/lib/file/dependency.js +568 -0
- package/lib/file/directory.d.ts +34 -0
- package/lib/file/directory.js +141 -0
- package/lib/file/errors.d.ts +20 -0
- package/lib/file/errors.js +18 -0
- package/lib/file/exportGraph.d.ts +31 -0
- package/lib/file/exportGraph.js +554 -0
- package/lib/file/file.d.ts +40 -0
- package/lib/file/file.js +339 -0
- package/lib/file/importGraph.d.ts +121 -0
- package/lib/file/importGraph.js +1022 -0
- package/lib/file/index.d.ts +45 -0
- package/lib/file/index.js +30 -0
- package/lib/file/metadata.d.ts +66 -0
- package/lib/file/metadata.js +470 -0
- package/lib/file/path.d.ts +60 -0
- package/lib/file/path.js +259 -0
- package/lib/file/read.d.ts +168 -0
- package/lib/file/read.js +541 -0
- package/lib/file/runtime.d.ts +95 -0
- package/lib/file/runtime.js +150 -0
- package/lib/file/service.d.ts +227 -0
- package/lib/file/service.js +663 -0
- package/lib/file/syntaxTree.d.ts +7 -0
- package/lib/file/syntaxTree.js +38 -0
- package/lib/file/time.d.ts +38 -0
- package/lib/file/time.js +44 -0
- package/lib/file/tree.d.ts +53 -0
- package/lib/file/tree.js +417 -0
- package/lib/file/types.d.ts +371 -0
- package/lib/file/types.js +1 -0
- package/lib/file/write.d.ts +159 -0
- package/lib/file/write.js +1028 -0
- package/lib/file/zip.d.ts +35 -0
- package/lib/file/zip.js +349 -0
- package/lib/fingerprint/algorithm.d.ts +97 -0
- package/lib/fingerprint/algorithm.js +271 -0
- package/lib/fingerprint/bytes.d.ts +18 -0
- package/lib/fingerprint/bytes.js +31 -0
- package/lib/fingerprint/error.d.ts +73 -0
- package/lib/fingerprint/error.js +86 -0
- package/lib/fingerprint/file.d.ts +71 -0
- package/lib/fingerprint/file.js +254 -0
- package/lib/fingerprint/index.d.ts +37 -0
- package/lib/fingerprint/index.js +12 -0
- package/lib/fingerprint/json.d.ts +41 -0
- package/lib/fingerprint/json.js +94 -0
- package/lib/fingerprint/number.d.ts +32 -0
- package/lib/fingerprint/number.js +95 -0
- package/lib/fingerprint/policy.d.ts +54 -0
- package/lib/fingerprint/policy.js +50 -0
- package/lib/fingerprint/preimage.d.ts +84 -0
- package/lib/fingerprint/preimage.js +133 -0
- package/lib/fingerprint/raw.d.ts +26 -0
- package/lib/fingerprint/raw.js +45 -0
- package/lib/fingerprint/ref.d.ts +39 -0
- package/lib/fingerprint/ref.js +178 -0
- package/lib/fingerprint/text.d.ts +42 -0
- package/lib/fingerprint/text.js +155 -0
- package/lib/fingerprint/tree.d.ts +56 -0
- package/lib/fingerprint/tree.js +288 -0
- package/lib/fingerprint/verify.d.ts +20 -0
- package/lib/fingerprint/verify.js +99 -0
- package/lib/global/filesystem.d.ts +43 -0
- package/lib/global/filesystem.js +75 -0
- package/lib/global/index.d.ts +8 -0
- package/lib/global/index.js +8 -0
- package/lib/global/service.d.ts +51 -0
- package/lib/global/service.js +98 -0
- package/lib/governance/transport.js +18 -6
- package/lib/hook/ast.d.ts +29 -0
- package/lib/hook/ast.js +22 -0
- package/lib/hook/code.d.ts +55 -0
- package/lib/hook/code.js +47 -0
- package/lib/hook/dependency.d.ts +45 -0
- package/lib/hook/dependency.js +28 -0
- package/lib/hook/diff.d.ts +114 -0
- package/lib/hook/diff.js +327 -0
- package/lib/hook/exportation.d.ts +31 -0
- package/lib/hook/exportation.js +24 -0
- package/lib/hook/file.d.ts +44 -0
- package/lib/hook/file.js +154 -0
- package/lib/hook/importation.d.ts +33 -0
- package/lib/hook/importation.js +22 -0
- package/lib/hook/index.d.ts +30 -0
- package/lib/hook/index.js +23 -0
- package/lib/hook/outline.d.ts +35 -0
- package/lib/hook/outline.js +27 -0
- package/lib/hook/project.d.ts +65 -0
- package/lib/hook/project.js +217 -0
- package/lib/hook/types.d.ts +114 -0
- package/lib/hook/types.js +407 -0
- package/lib/index.d.ts +9 -0
- package/lib/index.js +9 -0
- package/lib/lock/lease.js +28 -3
- package/lib/manifest/cardSign.d.ts +1 -1
- package/lib/manifest/cardSign.js +37 -7
- package/lib/manifest/federation.js +13 -6
- package/lib/manifest/trust.d.ts +2 -0
- package/lib/manifest/trust.js +27 -6
- package/lib/module/index.d.ts +4 -0
- package/lib/module/index.js +4 -0
- package/lib/module/mcp/client.js +21 -2
- package/lib/module/mcp/filesystemServer.d.ts +24 -0
- package/lib/module/mcp/filesystemServer.js +102 -0
- package/lib/module/mcp/http.js +32 -19
- package/lib/module/mcp/workspaceServer.js +20 -3
- package/lib/module/tool/filesystemExecutor.d.ts +18 -0
- package/lib/module/tool/filesystemExecutor.js +49 -0
- package/lib/module/tool/globalExecutor.d.ts +17 -0
- package/lib/module/tool/globalExecutor.js +39 -0
- package/lib/module/tool/globalFilesystemExecutor.d.ts +18 -0
- package/lib/module/tool/globalFilesystemExecutor.js +49 -0
- package/lib/module/tool/workspaceExecutor.d.ts +9 -0
- package/lib/module/tool/workspaceExecutor.js +16 -3
- package/lib/naming/aliases.d.ts +48 -0
- package/lib/naming/aliases.js +79 -0
- package/lib/naming/catalog.d.ts +117 -0
- package/lib/naming/catalog.js +108 -0
- package/lib/naming/grammar.d.ts +67 -0
- package/lib/naming/grammar.js +212 -0
- package/lib/naming/ids.d.ts +157 -0
- package/lib/naming/ids.js +119 -0
- package/lib/naming/index.d.ts +13 -0
- package/lib/naming/index.js +13 -0
- package/lib/outline/index.d.ts +9 -0
- package/lib/outline/index.js +8 -0
- package/lib/outline/office.d.ts +160 -0
- package/lib/outline/office.js +2375 -0
- package/lib/outline/officeBridge.d.ts +32 -0
- package/lib/outline/officeBridge.js +27 -0
- package/lib/outline/outline.d.ts +159 -0
- package/lib/outline/outline.js +837 -0
- package/lib/outline/outlineIndex.d.ts +97 -0
- package/lib/outline/outlineIndex.js +325 -0
- package/lib/outline/outlineKeywords.d.ts +59 -0
- package/lib/outline/outlineKeywords.js +143 -0
- package/lib/outline/outlineStrategies.d.ts +414 -0
- package/lib/outline/outlineStrategies.js +8324 -0
- package/lib/outline/reactOutline.d.ts +37 -0
- package/lib/outline/reactOutline.js +1070 -0
- package/lib/outline/shellOutline.d.ts +65 -0
- package/lib/outline/shellOutline.js +873 -0
- package/lib/outline/sqlOutline.d.ts +170 -0
- package/lib/outline/sqlOutline.js +1536 -0
- package/lib/outline/strategy.d.ts +46 -0
- package/lib/outline/strategy.js +1 -0
- package/lib/outline/types.d.ts +95 -0
- package/lib/outline/types.js +1 -0
- package/lib/outline/visualBasicOutline.d.ts +27 -0
- package/lib/outline/visualBasicOutline.js +750 -0
- package/lib/protocol/filesystem.d.ts +55 -0
- package/lib/protocol/filesystem.js +105 -0
- package/lib/protocol/global.d.ts +42 -0
- package/lib/protocol/global.js +63 -0
- package/lib/protocol/globalFilesystem.d.ts +40 -0
- package/lib/protocol/globalFilesystem.js +59 -0
- package/lib/protocol/index.d.ts +4 -0
- package/lib/protocol/index.js +4 -0
- package/lib/protocol/protocol.d.ts +4 -0
- package/lib/protocol/wire.js +5 -2
- package/lib/protocol/workspace.d.ts +305 -0
- package/lib/protocol/workspace.js +258 -0
- package/lib/receipt/receipt.d.ts +8 -0
- package/lib/registry/content.js +9 -3
- package/lib/runtime/kernelRuntime.js +9 -1
- package/lib/scenario/scenario.js +5 -4
- package/lib/semantic/canonical.d.ts +61 -0
- package/lib/semantic/canonical.js +135 -8
- package/lib/semantic/jsonValue.d.ts +31 -0
- package/lib/semantic/jsonValue.js +122 -0
- package/lib/semantic/sha256.js +3 -0
- package/lib/semantic/time.d.ts +14 -0
- package/lib/semantic/time.js +56 -0
- package/lib/session/context.d.ts +76 -0
- package/lib/session/context.js +419 -0
- package/lib/session/errors.d.ts +24 -0
- package/lib/session/errors.js +22 -0
- package/lib/session/identity.d.ts +24 -0
- package/lib/session/identity.js +56 -0
- package/lib/session/index.d.ts +14 -0
- package/lib/session/index.js +12 -0
- package/lib/session/registry.d.ts +130 -0
- package/lib/session/registry.js +908 -0
- package/lib/session/types.d.ts +227 -0
- package/lib/session/types.js +14 -0
- package/lib/structure/index.d.ts +1 -0
- package/lib/structure/index.js +1 -0
- package/lib/structure/trie.d.ts +88 -0
- package/lib/structure/trie.js +183 -0
- package/lib/syntax/byteIndex.d.ts +44 -0
- package/lib/syntax/byteIndex.js +148 -0
- package/lib/syntax/charset.d.ts +88 -0
- package/lib/syntax/charset.js +276 -0
- package/lib/syntax/index.d.ts +6 -0
- package/lib/syntax/index.js +5 -0
- package/lib/syntax/syntaxRegistry.d.ts +150 -0
- package/lib/syntax/syntaxRegistry.js +314 -0
- package/lib/syntax/syntaxTree.d.ts +106 -0
- package/lib/syntax/syntaxTree.js +668 -0
- package/lib/syntax/types.d.ts +15 -0
- package/lib/syntax/types.js +1 -0
- package/lib/types/common.d.ts +1 -1
- package/package.json +72 -193
- package/.editorconfig +0 -12
- package/.prettierignore +0 -17
- package/MCP-Token/347/250/216/344/270/216/344/270/213/344/270/200/344/273/243/345/267/245/345/205/267/345/215/217/350/256/256.html +0 -1763
- package/docs/annotation-campaign-A.csv +0 -54
- package/docs/annotation-campaign-B.csv +0 -54
- package/docs/annotation-campaign.csv +0 -54
- package/docs/eval/annotations-A.jsonl +0 -16
- package/docs/eval/annotations.json +0 -122
- package/docs/eval/recorded-labels.json +0 -12
- package/docs/eval/replay-cases.json +0 -14
- package/docs/eval/replay-labels-b.json +0 -14
- package/docs/examples/attention-request.json +0 -16
- package/docs/examples/checkpoint.json +0 -15
- package/docs/examples/claim.json +0 -66
- package/docs/examples/collaboration.json +0 -66
- package/docs/examples/concept-checkpoint.json +0 -15
- package/docs/examples/concept-prune-plan.json +0 -45
- package/docs/examples/federation.json +0 -126
- package/docs/examples/frame-chain.json +0 -77
- package/docs/examples/ledger-snapshot.json +0 -108
- package/docs/examples/manifest.json +0 -77
- package/docs/examples/message.json +0 -19
- package/docs/examples/other-model.json +0 -45
- package/docs/examples/plan.json +0 -50
- package/docs/examples/prune-plan.json +0 -48
- package/docs/examples/receipt.json +0 -22
- package/docs/examples/runtime-run.json +0 -573
- package/docs/examples/team.json +0 -66
- package/docs/examples/verb-note.json +0 -11
- package/docs/probes/bayes-scores.json +0 -1452
- package/docs/probes/calibration-imported.json +0 -141
- package/docs/probes/context-ast-deepseek.json +0 -1577
- package/docs/probes/deepseek-probe.json +0 -917
- package/docs/probes/eval-recorded-replay.json +0 -597
- package/docs/probes/eval-replay.json +0 -124
- package/docs/probes/eval-summary.json +0 -42
- package/docs/probes/runtime-eval.json +0 -4230
- package/docs/schemas/collaboration.schema.json +0 -73
- package/docs/schemas/common.schema.json +0 -125
- package/docs/schemas/compaction.schema.json +0 -121
- package/docs/schemas/concept-compaction.schema.json +0 -73
- package/docs/schemas/concept.schema.json +0 -97
- package/docs/schemas/epistemic.schema.json +0 -178
- package/docs/schemas/federation.schema.json +0 -66
- package/docs/schemas/frame.schema.json +0 -86
- package/docs/schemas/ledger-snapshot.schema.json +0 -30
- package/docs/schemas/manifest.schema.json +0 -169
- package/docs/schemas/message.schema.json +0 -41
- package/docs/schemas/plan.schema.json +0 -189
- package/docs/schemas/receipt.schema.json +0 -45
- package/docs/schemas/social.schema.json +0 -153
- package/docs/schemas/team.schema.json +0 -56
- package/docs/schemas/verb.schema.json +0 -120
- package/eslint.config.mts +0 -96
- package/index.html +0 -13
- package/lib/context/workspaceProtocol.d.ts +0 -30
- package/lib/context/workspaceProtocol.js +0 -49
- package/prettier.config.mts +0 -37
- package/public/favicon.svg +0 -1
- package/public/icons.svg +0 -24
- package/src/attention/attention.ts +0 -347
- package/src/attention/budget.ts +0 -72
- package/src/attention/cognition.ts +0 -519
- package/src/attention/index.ts +0 -8
- package/src/attention/interrupts.ts +0 -228
- package/src/attention/resource.ts +0 -316
- package/src/attention/social.ts +0 -217
- package/src/attention/socialTypes.ts +0 -115
- package/src/authz/authz.ts +0 -305
- package/src/authz/index.ts +0 -1
- package/src/bayes/calibration.ts +0 -204
- package/src/bayes/calibrationRegistry.ts +0 -111
- package/src/bayes/calibrationSelection.ts +0 -154
- package/src/bayes/engine.ts +0 -532
- package/src/bayes/index.ts +0 -6
- package/src/bayes/reliability.ts +0 -62
- package/src/bayes/scopedPriors.ts +0 -88
- package/src/boundary/frame.ts +0 -322
- package/src/boundary/ids.ts +0 -14
- package/src/boundary/index.ts +0 -12
- package/src/boundary/refTable.ts +0 -125
- package/src/boundary/toolCall.ts +0 -212
- package/src/concept/concept.ts +0 -75
- package/src/concept/conceptBudget.ts +0 -346
- package/src/concept/conceptBudgetTypes.ts +0 -79
- package/src/concept/index.ts +0 -3
- package/src/concurrency/idempotency.ts +0 -41
- package/src/concurrency/index.ts +0 -5
- package/src/concurrency/mutex.ts +0 -26
- package/src/concurrency/namedLocks.ts +0 -35
- package/src/concurrency/retry.ts +0 -50
- package/src/concurrency/worker.ts +0 -128
- package/src/context/agentContext.ts +0 -308
- package/src/context/ast.ts +0 -499
- package/src/context/contentStore.ts +0 -75
- package/src/context/context.ts +0 -65
- package/src/context/contextIndex.ts +0 -85
- package/src/context/document.ts +0 -137
- package/src/context/fileStorePath.ts +0 -14
- package/src/context/index.ts +0 -43
- package/src/context/lifecycle.ts +0 -221
- package/src/context/projections.ts +0 -151
- package/src/context/workspace.ts +0 -422
- package/src/context/workspaceProtocol.ts +0 -112
- package/src/context/workspaceService.ts +0 -423
- package/src/cooperation/board.ts +0 -104
- package/src/cooperation/collaboration.ts +0 -60
- package/src/cooperation/index.ts +0 -6
- package/src/cooperation/merge.ts +0 -190
- package/src/cooperation/metrics.ts +0 -57
- package/src/cooperation/session.ts +0 -131
- package/src/cooperation/unified.ts +0 -56
- package/src/counter.ts +0 -9
- package/src/database/adapter/adapters.ts +0 -35
- package/src/database/adapter/index.ts +0 -4
- package/src/database/adapter/runtimeSink.ts +0 -74
- package/src/database/adapter/sessionStore.ts +0 -32
- package/src/database/adapter/turnStore.ts +0 -23
- package/src/database/entity/agent.ts +0 -199
- package/src/database/entity/entity.ts +0 -1046
- package/src/database/entity/handle.ts +0 -79
- package/src/database/entity/index.ts +0 -32
- package/src/database/entity/message.ts +0 -74
- package/src/database/entity/meta.ts +0 -11
- package/src/database/entity/object.ts +0 -42
- package/src/database/entity/outbox.ts +0 -15
- package/src/database/entity/process.ts +0 -65
- package/src/database/entity/registry.ts +0 -155
- package/src/database/entity/runtimeApproval.ts +0 -30
- package/src/database/entity/runtimeSession.ts +0 -13
- package/src/database/entity/runtimeTurn.ts +0 -15
- package/src/database/entity/thread.ts +0 -85
- package/src/database/entity/window.ts +0 -85
- package/src/database/entity/worker.ts +0 -90
- package/src/database/index.ts +0 -6
- package/src/database/repository/addressSpaceRepository.ts +0 -72
- package/src/database/repository/agentRepository.ts +0 -460
- package/src/database/repository/base.ts +0 -41
- package/src/database/repository/executionRepository.ts +0 -477
- package/src/database/repository/handleRepository.ts +0 -64
- package/src/database/repository/index.ts +0 -20
- package/src/database/repository/messageRepository.ts +0 -52
- package/src/database/repository/objectRepository.ts +0 -69
- package/src/database/repository/outboxRepository.ts +0 -63
- package/src/database/repository/processRepository.ts +0 -58
- package/src/database/repository/registryRepository.ts +0 -119
- package/src/database/repository/repository.ts +0 -491
- package/src/database/repository/runtimeApprovalRepository.ts +0 -44
- package/src/database/repository/runtimeSessionRepository.ts +0 -27
- package/src/database/repository/runtimeTurnRepository.ts +0 -39
- package/src/database/repository/socialRepository.ts +0 -185
- package/src/database/repository/threadRepository.ts +0 -57
- package/src/database/repository/windowRepository.ts +0 -88
- package/src/database/repository/workerRepository.ts +0 -69
- package/src/database/service/database.ts +0 -90
- package/src/database/service/handleService.ts +0 -48
- package/src/database/service/index.ts +0 -16
- package/src/database/service/messageService.ts +0 -61
- package/src/database/service/objectService.ts +0 -59
- package/src/database/service/processService.ts +0 -61
- package/src/database/service/registryServices.ts +0 -88
- package/src/database/service/service.ts +0 -183
- package/src/database/service/stepService.ts +0 -53
- package/src/database/service/threadService.ts +0 -65
- package/src/database/service/windowService.ts +0 -30
- package/src/database/service/workerService.ts +0 -57
- package/src/database/sql/index.ts +0 -3
- package/src/database/sql/schema.ts +0 -418
- package/src/database/sql/sql.ts +0 -543
- package/src/database/store/database.ts +0 -210
- package/src/database/store/index.ts +0 -3
- package/src/database/store/store.ts +0 -266
- package/src/delegate/index.ts +0 -2
- package/src/delegate/team.ts +0 -268
- package/src/delegate/teamTypes.ts +0 -47
- package/src/diagnosis/checklist.ts +0 -74
- package/src/diagnosis/context.ts +0 -93
- package/src/diagnosis/frame.ts +0 -256
- package/src/diagnosis/index.ts +0 -5
- package/src/diagnosis/router.ts +0 -72
- package/src/diagnosis/types.ts +0 -89
- package/src/error/agentError.ts +0 -16
- package/src/error/ampError.ts +0 -20
- package/src/error/authzError.ts +0 -14
- package/src/error/boundaryRejection.ts +0 -20
- package/src/error/index.ts +0 -7
- package/src/error/kernelError.ts +0 -27
- package/src/error/mailboxError.ts +0 -9
- package/src/error/windowError.ts +0 -12
- package/src/evaluation/agreement.ts +0 -96
- package/src/evaluation/index.ts +0 -2
- package/src/evaluation/labels.ts +0 -241
- package/src/evidence/evidenceGraph.ts +0 -205
- package/src/evidence/index.ts +0 -4
- package/src/evidence/revalidation.ts +0 -191
- package/src/execution/exec.ts +0 -408
- package/src/execution/handles.ts +0 -65
- package/src/execution/index.ts +0 -3
- package/src/execution/pin.ts +0 -154
- package/src/frame/frame.ts +0 -70
- package/src/frame/index.ts +0 -1
- package/src/goal/goal.ts +0 -43
- package/src/goal/index.ts +0 -2
- package/src/goal/plan.ts +0 -196
- package/src/governance/attentionManifest.ts +0 -802
- package/src/governance/audit.ts +0 -362
- package/src/governance/budget.ts +0 -628
- package/src/governance/context.ts +0 -356
- package/src/governance/control.ts +0 -159
- package/src/governance/cooperation.ts +0 -479
- package/src/governance/credential.ts +0 -359
- package/src/governance/httpServer.ts +0 -99
- package/src/governance/index.ts +0 -32
- package/src/governance/legal.ts +0 -574
- package/src/governance/matrix.ts +0 -460
- package/src/governance/perspectives.ts +0 -406
- package/src/governance/signing.ts +0 -407
- package/src/governance/store.ts +0 -125
- package/src/governance/switching.ts +0 -459
- package/src/governance/toolPolicy.ts +0 -80
- package/src/governance/transport.ts +0 -204
- package/src/governance/types.ts +0 -380
- package/src/governance/workflow.ts +0 -743
- package/src/index.ts +0 -11
- package/src/interaction/index.ts +0 -1
- package/src/interaction/interaction.ts +0 -391
- package/src/ipc/index.ts +0 -4
- package/src/ipc/mailbox.ts +0 -132
- package/src/ipc/memorySocialStore.ts +0 -93
- package/src/ipc/social.ts +0 -93
- package/src/kernel/index.ts +0 -14
- package/src/kernel/scheduler.ts +0 -498
- package/src/ledger/checkpoint.ts +0 -304
- package/src/ledger/index.ts +0 -4
- package/src/ledger/ledger.ts +0 -31
- package/src/ledger/persistence.ts +0 -159
- package/src/ledger/share.ts +0 -80
- package/src/lock/index.ts +0 -2
- package/src/lock/lease.ts +0 -74
- package/src/main.ts +0 -199
- package/src/manifest/agentCard.ts +0 -72
- package/src/manifest/cardSign.ts +0 -87
- package/src/manifest/federation.ts +0 -237
- package/src/manifest/federationTypes.ts +0 -55
- package/src/manifest/index.ts +0 -8
- package/src/manifest/keys.ts +0 -643
- package/src/manifest/manifest.ts +0 -114
- package/src/manifest/sign.ts +0 -134
- package/src/manifest/trust.ts +0 -146
- package/src/mission/index.ts +0 -2
- package/src/mission/missionQueue.ts +0 -75
- package/src/module/index.ts +0 -9
- package/src/module/llm/deepseek.ts +0 -214
- package/src/module/llm/llm.ts +0 -84
- package/src/module/mcp/client.ts +0 -110
- package/src/module/mcp/http.ts +0 -102
- package/src/module/mcp/protocol.ts +0 -77
- package/src/module/mcp/server.ts +0 -148
- package/src/module/mcp/transport.ts +0 -30
- package/src/module/mcp/workspaceServer.ts +0 -111
- package/src/module/sandbox/sandbox.ts +0 -29
- package/src/module/tool/mcpExecutor.ts +0 -54
- package/src/module/tool/policy.ts +0 -52
- package/src/module/tool/redact.ts +0 -29
- package/src/module/tool/tool.ts +0 -53
- package/src/module/tool/workspaceExecutor.ts +0 -35
- package/src/policy/guard.ts +0 -240
- package/src/policy/index.ts +0 -2
- package/src/policy/policy.ts +0 -561
- package/src/process/agent.ts +0 -341
- package/src/process/agentService.ts +0 -236
- package/src/process/agentStore.ts +0 -378
- package/src/process/executionStore.ts +0 -151
- package/src/process/index.ts +0 -5
- package/src/process/process.ts +0 -240
- package/src/process/transitions.ts +0 -19
- package/src/progress/index.ts +0 -2
- package/src/progress/progress.ts +0 -85
- package/src/protocol/a2a.ts +0 -120
- package/src/protocol/channel.ts +0 -44
- package/src/protocol/envelope.ts +0 -655
- package/src/protocol/httpChannel.ts +0 -87
- package/src/protocol/index.ts +0 -6
- package/src/protocol/protocol.ts +0 -138
- package/src/protocol/wire.ts +0 -60
- package/src/receipt/index.ts +0 -1
- package/src/receipt/receipt.ts +0 -47
- package/src/registry/content.ts +0 -69
- package/src/registry/index.ts +0 -23
- package/src/registry/registry.ts +0 -599
- package/src/runtime/action.ts +0 -87
- package/src/runtime/behavior.ts +0 -330
- package/src/runtime/behaviorTuning.ts +0 -163
- package/src/runtime/cognitiveRuntime.ts +0 -703
- package/src/runtime/escalation.ts +0 -35
- package/src/runtime/governedTask.ts +0 -233
- package/src/runtime/index.ts +0 -15
- package/src/runtime/kernelRuntime.ts +0 -144
- package/src/runtime/operation.ts +0 -35
- package/src/runtime/replay.ts +0 -71
- package/src/runtime/routing.ts +0 -58
- package/src/runtime/safety.ts +0 -48
- package/src/runtime/session.ts +0 -341
- package/src/runtime/sessionStore.ts +0 -43
- package/src/runtime/telemetry.ts +0 -55
- package/src/runtime/turnStore.ts +0 -30
- package/src/scenario/index.ts +0 -1
- package/src/scenario/scenario.ts +0 -299
- package/src/semantic/canonical.ts +0 -24
- package/src/semantic/index.ts +0 -2
- package/src/semantic/sha256.ts +0 -82
- package/src/storage/appendLog.ts +0 -372
- package/src/storage/fileAppendSink.ts +0 -40
- package/src/storage/index.ts +0 -2
- package/src/store/bindCache.ts +0 -22
- package/src/store/cache.ts +0 -191
- package/src/store/context.ts +0 -31
- package/src/store/handleStore.ts +0 -31
- package/src/store/index.ts +0 -9
- package/src/store/messageStore.ts +0 -31
- package/src/store/objectStore.ts +0 -31
- package/src/store/processStore.ts +0 -31
- package/src/store/threadStore.ts +0 -31
- package/src/store/windowStore.ts +0 -31
- package/src/structure/abstractSyntaxTree.ts +0 -493
- package/src/structure/avlTree.ts +0 -408
- package/src/structure/binarySearchTree.ts +0 -352
- package/src/structure/binaryTree.ts +0 -525
- package/src/structure/bloomFilter.ts +0 -231
- package/src/structure/compare.ts +0 -110
- package/src/structure/cuckooFilter.ts +0 -337
- package/src/structure/deque.ts +0 -223
- package/src/structure/filterKey.ts +0 -36
- package/src/structure/hash.ts +0 -279
- package/src/structure/heap.ts +0 -268
- package/src/structure/index.ts +0 -20
- package/src/structure/iterator.ts +0 -22
- package/src/structure/lru.ts +0 -619
- package/src/structure/ordered.ts +0 -399
- package/src/structure/priority.ts +0 -915
- package/src/structure/queue.ts +0 -168
- package/src/structure/redBlackTree.ts +0 -680
- package/src/structure/segmentTree.ts +0 -248
- package/src/structure/stack.ts +0 -118
- package/src/structure/unordered.ts +0 -407
- package/src/style.css +0 -278
- package/src/thread/index.ts +0 -2
- package/src/thread/thread.ts +0 -176
- package/src/thread/transitions.ts +0 -17
- package/src/types/common.ts +0 -119
- package/src/types/index.ts +0 -23
- package/src/warrant/epistemic.ts +0 -154
- package/src/warrant/index.ts +0 -3
- package/src/warrant/inquiry.ts +0 -166
- package/src/warrant/warrant.ts +0 -179
- package/src/window/compaction.ts +0 -403
- package/src/window/compactionTypes.ts +0 -119
- package/src/window/index.ts +0 -7
- package/src/window/page.ts +0 -18
- package/src/window/window.ts +0 -244
- package/tools/_helpers.ts +0 -34
- package/tools/a2a-check.ts +0 -110
- package/tools/a2a-flow-check.ts +0 -78
- package/tools/agent-card-check.ts +0 -76
- package/tools/agent-check.ts +0 -236
- package/tools/agent-store-check.ts +0 -153
- package/tools/agreement-check.ts +0 -27
- package/tools/annotation-server-check.ts +0 -48
- package/tools/annotation-server.ts +0 -230
- package/tools/annotation-status.ts +0 -65
- package/tools/approval-access-check.ts +0 -66
- package/tools/arch-check.ts +0 -72
- package/tools/attention-core-check.ts +0 -48
- package/tools/attention-resource-check.ts +0 -169
- package/tools/audit-check.ts +0 -207
- package/tools/authority-check.ts +0 -124
- package/tools/authz-check.ts +0 -138
- package/tools/bayes-check.ts +0 -162
- package/tools/bayes-probe.ts +0 -154
- package/tools/behavior-tuning-check.ts +0 -53
- package/tools/board-check.ts +0 -87
- package/tools/boundary-check.ts +0 -199
- package/tools/bundle-trust-check.ts +0 -96
- package/tools/calibrate-imported.ts +0 -108
- package/tools/calibration-check.ts +0 -44
- package/tools/calibration-registry-check.ts +0 -40
- package/tools/calibration-sim.ts +0 -40
- package/tools/card-sign-check.ts +0 -71
- package/tools/card-trust-check.ts +0 -78
- package/tools/channel-check.ts +0 -86
- package/tools/checkpoint-check.ts +0 -620
- package/tools/cleanup-style-configs.ts +0 -29
- package/tools/cognition-check.ts +0 -648
- package/tools/cognitive-runtime-check.ts +0 -609
- package/tools/collaboration-demo.ts +0 -78
- package/tools/compaction-check.ts +0 -266
- package/tools/concept-check.ts +0 -260
- package/tools/concurrency-check.ts +0 -242
- package/tools/conformance-runtime.ts +0 -389
- package/tools/conformance.ts +0 -651
- package/tools/context-ast-check.ts +0 -90
- package/tools/context-ast-deepseek.ts +0 -242
- package/tools/context-graph-bench.ts +0 -50
- package/tools/context-graph-check.ts +0 -229
- package/tools/context-index-check.ts +0 -48
- package/tools/context-lifecycle-check.ts +0 -69
- package/tools/context-projection-check.ts +0 -73
- package/tools/context-scope-check.ts +0 -134
- package/tools/context-storage-check.ts +0 -113
- package/tools/cooperation-check.ts +0 -517
- package/tools/cooperation-http-check.ts +0 -125
- package/tools/deepseek-llm-check.ts +0 -147
- package/tools/deepseek-probe.ts +0 -494
- package/tools/diagnosis-check.ts +0 -109
- package/tools/diagnosis-router-check.ts +0 -50
- package/tools/document-context-check.ts +0 -237
- package/tools/envelope-check.ts +0 -659
- package/tools/eslint-rules/index.ts +0 -26
- package/tools/eslint-rules/rules/jsdoc-comment-format.ts +0 -105
- package/tools/eslint-rules/rules/no-function-keyword.ts +0 -60
- package/tools/eslint-rules/rules/no-multiline-parameters.ts +0 -71
- package/tools/eslint-rules/rules/no-multiline-type-parameters.ts +0 -57
- package/tools/eslint-rules/rules/no-undefined-comparison.ts +0 -115
- package/tools/eslint-rules/rules/prefer-template-for-string-conversion.ts +0 -97
- package/tools/eslint-rules/rules/require-typeof-parentheses.ts +0 -49
- package/tools/eslint-rules/rules/require-variable-type.ts +0 -36
- package/tools/eslint-rules/rules/variable-naming.ts +0 -175
- package/tools/eval-recorded-replay.ts +0 -215
- package/tools/eval-replay.ts +0 -139
- package/tools/eval-summary.ts +0 -136
- package/tools/evidence-revalidation-check.ts +0 -235
- package/tools/exec-check.ts +0 -217
- package/tools/federation-check.ts +0 -166
- package/tools/federation-demo.ts +0 -45
- package/tools/filter-check.ts +0 -243
- package/tools/governance-check.ts +0 -680
- package/tools/governance-store-check.ts +0 -131
- package/tools/governed-task-check.ts +0 -227
- package/tools/guard-check.ts +0 -122
- package/tools/http-channel-check.ts +0 -125
- package/tools/import-campaign.ts +0 -28
- package/tools/inquiry-check.ts +0 -126
- package/tools/interaction-check.ts +0 -171
- package/tools/interrupts-check.ts +0 -173
- package/tools/ipc-check.ts +0 -170
- package/tools/kernel-async-check.ts +0 -136
- package/tools/kernel-check.ts +0 -369
- package/tools/kernel-runtime-check.ts +0 -276
- package/tools/keys-check.ts +0 -559
- package/tools/label-audit.ts +0 -70
- package/tools/labels-workflow-check.ts +0 -49
- package/tools/linear-structure-check.ts +0 -524
- package/tools/live-exec.ts +0 -62
- package/tools/live-governance-eval.ts +0 -813
- package/tools/live-legacy.ts +0 -50
- package/tools/lru-check.ts +0 -182
- package/tools/make-annotation-campaign.ts +0 -57
- package/tools/mcp-executor-check.ts +0 -33
- package/tools/merge-annotations.ts +0 -32
- package/tools/merge-check.ts +0 -98
- package/tools/metrics-check.ts +0 -84
- package/tools/net-probe.ts +0 -107
- package/tools/oauth-probe.ts +0 -117
- package/tools/outbox-check.ts +0 -50
- package/tools/persistence-check.ts +0 -144
- package/tools/pin-check.ts +0 -116
- package/tools/platform-check.ts +0 -281
- package/tools/policy-check.ts +0 -514
- package/tools/prettier-plugin/index.mts +0 -84
- package/tools/priority-check.ts +0 -627
- package/tools/probe-context7.ts +0 -63
- package/tools/registry-check.ts +0 -252
- package/tools/reliability-check.ts +0 -25
- package/tools/retry-check.ts +0 -85
- package/tools/rewrite-declaration-extensions.ts +0 -98
- package/tools/runtime-check.ts +0 -165
- package/tools/runtime-deepseek-check.ts +0 -85
- package/tools/runtime-eval.ts +0 -358
- package/tools/scenario-check.ts +0 -161
- package/tools/scenario-incident.ts +0 -162
- package/tools/scoped-priors-check.ts +0 -35
- package/tools/scoped-priors-pooling.ts +0 -34
- package/tools/segment-ast-check.ts +0 -649
- package/tools/session-check.ts +0 -196
- package/tools/session-store-check.ts +0 -73
- package/tools/share-check.ts +0 -88
- package/tools/sign-check.ts +0 -95
- package/tools/signing-check.ts +0 -275
- package/tools/snapshot-demo.ts +0 -65
- package/tools/social-check.ts +0 -146
- package/tools/structure-compare-check.ts +0 -95
- package/tools/support/documentScanner.ts +0 -577
- package/tools/support/texScanner.ts +0 -631
- package/tools/support/workspaceScanner.ts +0 -476
- package/tools/team-check.ts +0 -163
- package/tools/team-demo.ts +0 -36
- package/tools/telemetry-check.ts +0 -44
- package/tools/tex-context-check.ts +0 -263
- package/tools/tool-gate-check.ts +0 -98
- package/tools/tree-structure-check.ts +0 -786
- package/tools/trust-flow-check.ts +0 -158
- package/tools/turn-store-check.ts +0 -57
- package/tools/unified-check.ts +0 -83
- package/tools/validate.ts +0 -309
- package/tools/wire-check.ts +0 -96
- package/tools/workspace-agent-check.ts +0 -486
- package/tools/workspace-agent-demo.ts +0 -62
- package/tools/workspace-agent-server.ts +0 -101
- package/tools/workspace-context-check.ts +0 -331
- package/tools/workspace-context.ts +0 -131
- package/tsconfig.build.json +0 -14
- package/tsconfig.json +0 -24
- package/tsconfig.tools.json +0 -31
- package/viz/context-ast.json +0 -1577
|
@@ -1,1763 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="zh-CN" class="no-js">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
-
<title>MCP 的 Token 税 · 下一代工具协议技术尽调(2026)</title>
|
|
7
|
-
<meta name="description" content="MCP 工具定义与结果正在吞噬 Agent 的上下文。本报告拆解四类 token 成本,梳理 2025–2026 前沿方案、成功与失败样例,给出可行路线、不可行路线与分阶段落地建议。">
|
|
8
|
-
<style>
|
|
9
|
-
/* ============ reset ============ */
|
|
10
|
-
*,*::before,*::after{box-sizing:border-box}
|
|
11
|
-
html{-webkit-text-size-adjust:100%;scroll-behavior:smooth}
|
|
12
|
-
body{margin:0}
|
|
13
|
-
img,svg{display:block;max-width:100%}
|
|
14
|
-
button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}
|
|
15
|
-
a{color:inherit}
|
|
16
|
-
h1,h2,h3,h4,p,ul,ol,figure,blockquote{margin:0}
|
|
17
|
-
ul,ol{padding:0;list-style:none}
|
|
18
|
-
|
|
19
|
-
/* ============ tokens ============ */
|
|
20
|
-
:root{
|
|
21
|
-
--paper:#f4f2eb;
|
|
22
|
-
--paper-2:#ece9df;
|
|
23
|
-
--card:#fbfaf6;
|
|
24
|
-
--ink:#15171c;
|
|
25
|
-
--ink-2:#31353d;
|
|
26
|
-
--muted:#646973;
|
|
27
|
-
--faint:#8d9198;
|
|
28
|
-
--line:#ddd8ca;
|
|
29
|
-
--line-strong:#c6bfae;
|
|
30
|
-
--rust:#ac361c;
|
|
31
|
-
--rust-2:#c9502f;
|
|
32
|
-
--rust-soft:#f1ded6;
|
|
33
|
-
--teal:#1c5b57;
|
|
34
|
-
--teal-soft:#dbe7e4;
|
|
35
|
-
--gold:#9a7a26;
|
|
36
|
-
--dark:#131519;
|
|
37
|
-
--dark-2:#1b1e24;
|
|
38
|
-
--mono:ui-monospace,"SFMono-Regular","Cascadia Mono","JetBrains Mono",Consolas,monospace;
|
|
39
|
-
--sans:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei","Noto Sans CJK SC",sans-serif;
|
|
40
|
-
--serif:"Songti SC","STSong","Noto Serif CJK SC",Georgia,"Times New Roman",serif;
|
|
41
|
-
--rail:236px;
|
|
42
|
-
--ease:cubic-bezier(.22,.61,.36,1);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/* ============ base ============ */
|
|
46
|
-
html.js{scroll-padding-top:32px}
|
|
47
|
-
body{
|
|
48
|
-
background:var(--paper);
|
|
49
|
-
color:var(--ink);
|
|
50
|
-
font-family:var(--sans);
|
|
51
|
-
font-size:16.5px;
|
|
52
|
-
line-height:1.85;
|
|
53
|
-
letter-spacing:.005em;
|
|
54
|
-
-webkit-font-smoothing:antialiased;
|
|
55
|
-
text-rendering:optimizeLegibility;
|
|
56
|
-
}
|
|
57
|
-
::selection{background:var(--rust);color:#fff}
|
|
58
|
-
|
|
59
|
-
/* ============ progress ============ */
|
|
60
|
-
#progress{position:fixed;top:0;left:0;height:2px;width:0;background:var(--rust);z-index:120;transition:width .08s linear}
|
|
61
|
-
|
|
62
|
-
/* ============ rail ============ */
|
|
63
|
-
.rail{
|
|
64
|
-
position:fixed;inset:0 auto 0 0;width:var(--rail);
|
|
65
|
-
padding:34px 26px 28px 30px;
|
|
66
|
-
border-right:1px solid var(--line);
|
|
67
|
-
background:linear-gradient(180deg,var(--paper) 0%,var(--paper-2) 100%);
|
|
68
|
-
display:flex;flex-direction:column;gap:26px;z-index:100;
|
|
69
|
-
overflow-y:auto;
|
|
70
|
-
}
|
|
71
|
-
.brand{display:flex;align-items:flex-start;gap:10px;text-decoration:none}
|
|
72
|
-
.brand-mark{
|
|
73
|
-
width:30px;height:30px;flex:0 0 auto;border:1px solid var(--ink);
|
|
74
|
-
display:grid;place-items:center;font-family:var(--mono);font-size:10px;letter-spacing:-.04em;
|
|
75
|
-
position:relative;top:2px;
|
|
76
|
-
}
|
|
77
|
-
.brand-mark i{display:block;width:5px;height:5px;background:var(--rust);border-radius:50%}
|
|
78
|
-
.brand-txt{font-size:12.5px;line-height:1.5;letter-spacing:.02em}
|
|
79
|
-
.brand-txt b{display:block;font-weight:650;font-size:13px}
|
|
80
|
-
.brand-txt span{color:var(--muted);font-family:var(--mono);font-size:10.5px;letter-spacing:.04em}
|
|
81
|
-
.nav-label{font-family:var(--mono);font-size:9.5px;letter-spacing:.18em;color:var(--faint);text-transform:uppercase;margin-bottom:10px}
|
|
82
|
-
.nav ul{display:flex;flex-direction:column;gap:1px}
|
|
83
|
-
.nav a{
|
|
84
|
-
display:grid;grid-template-columns:20px 1fr;gap:6px;align-items:baseline;
|
|
85
|
-
text-decoration:none;font-size:12.5px;line-height:1.5;color:var(--muted);
|
|
86
|
-
padding:5px 0;border-left:1px solid transparent;padding-left:0;
|
|
87
|
-
transition:color .18s var(--ease),padding .18s var(--ease),border-color .18s var(--ease);
|
|
88
|
-
}
|
|
89
|
-
.nav a em{font-family:var(--mono);font-style:normal;font-size:9.5px;color:var(--faint);letter-spacing:.02em}
|
|
90
|
-
.nav a:hover{color:var(--ink)}
|
|
91
|
-
.nav a.active{color:var(--ink);font-weight:600}
|
|
92
|
-
.nav a.active em{color:var(--rust)}
|
|
93
|
-
.nav a.active span{position:relative}
|
|
94
|
-
.nav a.active span::after{content:"";position:absolute;left:0;right:0;bottom:-2px;height:1px;background:var(--rust)}
|
|
95
|
-
.rail-foot{margin-top:auto;padding-top:18px;border-top:1px solid var(--line);font-size:10.5px;line-height:1.7;color:var(--faint);font-family:var(--mono)}
|
|
96
|
-
.rail-foot b{color:var(--muted);font-weight:500}
|
|
97
|
-
|
|
98
|
-
/* ============ shell ============ */
|
|
99
|
-
.shell{margin-left:var(--rail);padding:0 56px 0 60px}
|
|
100
|
-
.shell>*{width:100%;max-width:1180px;margin-left:auto;margin-right:auto}
|
|
101
|
-
section{scroll-margin-top:20px}
|
|
102
|
-
.sec{padding:86px 0 8px;border-top:1px solid var(--line)}
|
|
103
|
-
.sec:first-of-type{border-top:0}
|
|
104
|
-
|
|
105
|
-
/* ============ hero ============ */
|
|
106
|
-
.hero{
|
|
107
|
-
min-height:100svh;display:grid;grid-template-columns:1fr 330px;gap:56px;
|
|
108
|
-
align-content:center;padding:96px 0 72px;position:relative;
|
|
109
|
-
}
|
|
110
|
-
.kicker{
|
|
111
|
-
display:flex;align-items:center;gap:10px;font-family:var(--mono);
|
|
112
|
-
font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--rust);
|
|
113
|
-
margin-bottom:26px;
|
|
114
|
-
}
|
|
115
|
-
.kicker::before{content:"";width:26px;height:1px;background:var(--rust);display:block}
|
|
116
|
-
h1{
|
|
117
|
-
font-size:clamp(52px,6.6vw,84px);line-height:.98;letter-spacing:-.045em;font-weight:730;
|
|
118
|
-
margin-bottom:30px;text-wrap:balance;
|
|
119
|
-
}
|
|
120
|
-
h1 .l2{display:block}
|
|
121
|
-
h1 em{font-style:normal;color:var(--rust);position:relative;white-space:nowrap;background:linear-gradient(180deg,transparent 66%,var(--rust-soft) 66%)}
|
|
122
|
-
.dek{font-size:19px;line-height:1.75;color:var(--ink-2);max-width:33em;letter-spacing:.01em}
|
|
123
|
-
.dek b{font-weight:650;box-shadow:inset 0 -0.42em 0 var(--rust-soft)}
|
|
124
|
-
.hero-meta{display:flex;flex-wrap:wrap;gap:8px 22px;margin-top:34px;font-family:var(--mono);font-size:10.5px;letter-spacing:.06em;color:var(--faint)}
|
|
125
|
-
.hero-meta span{display:flex;align-items:center;gap:7px}
|
|
126
|
-
.hero-meta i{width:4px;height:4px;background:var(--line-strong);border-radius:50%;display:block}
|
|
127
|
-
|
|
128
|
-
/* ledger visual */
|
|
129
|
-
.ledger{align-self:end;padding-bottom:6px}
|
|
130
|
-
.ledger-head{display:flex;justify-content:space-between;align-items:baseline;font-family:var(--mono);font-size:9.5px;letter-spacing:.12em;color:var(--faint);text-transform:uppercase;margin-bottom:12px}
|
|
131
|
-
.ledger-head b{color:var(--ink);font-weight:600}
|
|
132
|
-
.window{
|
|
133
|
-
border:1px solid var(--ink);height:340px;display:flex;flex-direction:column;
|
|
134
|
-
background:var(--card);box-shadow:6px 6px 0 var(--paper-2);
|
|
135
|
-
}
|
|
136
|
-
.win-seg{position:relative;border-bottom:1px solid rgba(0,0,0,.14);display:flex;align-items:center;padding:0 11px;overflow:hidden}
|
|
137
|
-
.win-seg:last-child{border-bottom:0}
|
|
138
|
-
.win-seg span{font-family:var(--mono);font-size:9.5px;letter-spacing:.03em;white-space:nowrap}
|
|
139
|
-
.win-seg b{font-weight:600}
|
|
140
|
-
.s-sys{flex:24;background:var(--paper-2);color:var(--muted)}
|
|
141
|
-
.s-github{flex:55;background:var(--rust);color:#fff}
|
|
142
|
-
.s-other{flex:29;background:var(--rust-soft);color:var(--rust)}
|
|
143
|
-
.s-free{flex:92;background:repeating-linear-gradient(135deg,transparent 0 6px,rgba(0,0,0,.045) 6px 7px);color:var(--faint)}
|
|
144
|
-
.win-seg .pct{margin-left:auto;opacity:.7;font-size:9px}
|
|
145
|
-
.ledger-note{font-size:11px;line-height:1.65;color:var(--faint);margin-top:12px;font-family:var(--mono)}
|
|
146
|
-
.ledger-scale{display:flex;justify-content:space-between;font-family:var(--mono);font-size:9px;color:var(--faint);margin-top:6px}
|
|
147
|
-
|
|
148
|
-
/* ============ section head ============ */
|
|
149
|
-
.sec-head{display:grid;grid-template-columns:86px 1fr;gap:22px;margin-bottom:44px;align-items:start}
|
|
150
|
-
.sec-num{
|
|
151
|
-
font-family:var(--mono);font-size:11px;letter-spacing:.1em;color:var(--rust);
|
|
152
|
-
padding-top:9px;border-top:1px solid var(--rust);
|
|
153
|
-
}
|
|
154
|
-
h2{font-size:clamp(28px,3.4vw,40px);line-height:1.22;letter-spacing:-.03em;font-weight:700;text-wrap:balance}
|
|
155
|
-
h2 .sub{display:block;font-size:14.5px;line-height:1.7;font-weight:400;letter-spacing:.01em;color:var(--muted);margin-top:12px;max-width:44em}
|
|
156
|
-
h3{font-size:20px;line-height:1.45;letter-spacing:-.015em;font-weight:660}
|
|
157
|
-
h4{font-size:14px;letter-spacing:.02em;font-weight:650}
|
|
158
|
-
p{max-width:46em}
|
|
159
|
-
p+p{margin-top:14px}
|
|
160
|
-
.lead{font-size:18.5px;line-height:1.8;color:var(--ink-2)}
|
|
161
|
-
.small{font-size:13px;line-height:1.75;color:var(--muted)}
|
|
162
|
-
.mono{font-family:var(--mono)}
|
|
163
|
-
.hl{background:linear-gradient(180deg,transparent 62%,var(--rust-soft) 62%);padding:0 1px}
|
|
164
|
-
.hl-t{background:linear-gradient(180deg,transparent 62%,var(--teal-soft) 62%);padding:0 1px}
|
|
165
|
-
|
|
166
|
-
/* ============ components ============ */
|
|
167
|
-
.grid{display:grid;gap:18px}
|
|
168
|
-
.g2{grid-template-columns:repeat(2,1fr)}
|
|
169
|
-
.g3{grid-template-columns:repeat(3,1fr)}
|
|
170
|
-
.g4{grid-template-columns:repeat(4,1fr)}
|
|
171
|
-
.card{
|
|
172
|
-
background:var(--card);border:1px solid var(--line);padding:24px 24px 22px;
|
|
173
|
-
position:relative;transition:border-color .2s var(--ease),transform .2s var(--ease);
|
|
174
|
-
}
|
|
175
|
-
.card:hover{border-color:var(--line-strong)}
|
|
176
|
-
.card .idx{font-family:var(--mono);font-size:9.5px;letter-spacing:.12em;color:var(--faint);display:block;margin-bottom:12px}
|
|
177
|
-
.card h4{margin-bottom:7px;font-size:15px}
|
|
178
|
-
.card p{font-size:13.5px;line-height:1.75;color:var(--muted);max-width:none}
|
|
179
|
-
.card .why{margin-top:12px;padding-top:11px;border-top:1px dashed var(--line);font-size:12.5px;color:var(--ink-2)}
|
|
180
|
-
.card .why b{color:var(--rust);font-weight:600}
|
|
181
|
-
|
|
182
|
-
.tag{
|
|
183
|
-
display:inline-flex;align-items:center;gap:5px;font-family:var(--mono);
|
|
184
|
-
font-size:9px;letter-spacing:.08em;text-transform:uppercase;
|
|
185
|
-
padding:2px 6px;border:1px solid var(--line-strong);color:var(--muted);white-space:nowrap;
|
|
186
|
-
}
|
|
187
|
-
.tag.live{color:var(--teal);border-color:#a8c4bf;background:var(--teal-soft)}
|
|
188
|
-
.tag.hot{color:var(--rust);border-color:#d9ab9b;background:var(--rust-soft)}
|
|
189
|
-
.tag.dark{color:#fff;background:var(--ink);border-color:var(--ink)}
|
|
190
|
-
.tag-row{display:flex;gap:6px;flex-wrap:wrap;margin-top:14px}
|
|
191
|
-
|
|
192
|
-
.callout{
|
|
193
|
-
border-left:2px solid var(--rust);background:var(--card);
|
|
194
|
-
padding:22px 26px;margin:28px 0;
|
|
195
|
-
}
|
|
196
|
-
.callout.teal{border-left-color:var(--teal)}
|
|
197
|
-
.callout.dark{background:var(--dark);color:#e8e6df;border-left-color:var(--gold)}
|
|
198
|
-
.callout h4{margin-bottom:8px;font-size:13px;letter-spacing:.06em;text-transform:uppercase;font-family:var(--mono);font-weight:600;color:var(--rust)}
|
|
199
|
-
.callout.teal h4{color:var(--teal)}
|
|
200
|
-
.callout.dark h4{color:var(--gold)}
|
|
201
|
-
.callout p{font-size:14.5px;line-height:1.8;color:var(--ink-2);max-width:48em}
|
|
202
|
-
.callout.dark p{color:#cfcdc5}
|
|
203
|
-
|
|
204
|
-
.stat{border-top:2px solid var(--ink);padding-top:14px}
|
|
205
|
-
.stat b{display:block;font-family:var(--mono);font-size:clamp(30px,3.6vw,42px);font-weight:600;letter-spacing:-.05em;line-height:1;color:var(--ink)}
|
|
206
|
-
.stat b small{font-size:.42em;letter-spacing:0;margin-left:3px;color:var(--muted);font-weight:500}
|
|
207
|
-
.stat span{display:block;margin-top:9px;font-size:12.5px;line-height:1.6;color:var(--muted)}
|
|
208
|
-
.stat.red b{color:var(--rust)}
|
|
209
|
-
.stat.teal b{color:var(--teal)}
|
|
210
|
-
|
|
211
|
-
/* tables */
|
|
212
|
-
.tbl-wrap{overflow-x:auto;border:1px solid var(--line);background:var(--card);margin:26px 0}
|
|
213
|
-
table{border-collapse:collapse;width:100%;font-size:13px;line-height:1.6;min-width:640px}
|
|
214
|
-
th,td{text-align:left;padding:12px 14px;border-bottom:1px solid var(--line);vertical-align:top}
|
|
215
|
-
th{
|
|
216
|
-
font-family:var(--mono);font-size:9.5px;letter-spacing:.1em;text-transform:uppercase;
|
|
217
|
-
color:var(--muted);font-weight:600;background:var(--paper-2);border-bottom:1px solid var(--line-strong);
|
|
218
|
-
position:sticky;top:0;
|
|
219
|
-
}
|
|
220
|
-
tbody tr:last-child td{border-bottom:0}
|
|
221
|
-
tbody tr:hover{background:#f7f5ee}
|
|
222
|
-
td.num{font-family:var(--mono);font-variant-numeric:tabular-nums;white-space:nowrap}
|
|
223
|
-
td b{font-weight:650}
|
|
224
|
-
.tbl-note{font-size:11.5px;color:var(--faint);margin-top:-16px;margin-bottom:28px;line-height:1.7}
|
|
225
|
-
|
|
226
|
-
/* score cells */
|
|
227
|
-
.sc{display:inline-flex;gap:2px;vertical-align:middle}
|
|
228
|
-
.sc i{width:6px;height:14px;background:var(--line);display:block}
|
|
229
|
-
.sc i.on{background:var(--teal)}
|
|
230
|
-
.sc i.on.warn{background:var(--gold)}
|
|
231
|
-
.sc i.on.bad{background:var(--rust)}
|
|
232
|
-
.sc-wrap{display:flex;align-items:center;gap:7px;white-space:nowrap}
|
|
233
|
-
.sc-wrap em{font-style:normal;font-family:var(--mono);font-size:10px;color:var(--faint)}
|
|
234
|
-
|
|
235
|
-
/* code */
|
|
236
|
-
pre{
|
|
237
|
-
background:var(--dark);color:#d9d6cc;padding:18px 20px;overflow-x:auto;
|
|
238
|
-
font-family:var(--mono);font-size:12px;line-height:1.75;margin:18px 0;border-left:2px solid var(--gold);
|
|
239
|
-
}
|
|
240
|
-
code{font-family:var(--mono);font-size:.88em;background:rgba(0,0,0,.055);padding:1px 4px;border-radius:2px}
|
|
241
|
-
pre code{background:none;padding:0;font-size:inherit;color:inherit}
|
|
242
|
-
.cm{color:#7d848f}
|
|
243
|
-
.k{color:#e0a06f}
|
|
244
|
-
.s{color:#9fc6a0}
|
|
245
|
-
.f{color:#8fb8d6}
|
|
246
|
-
|
|
247
|
-
/* quote */
|
|
248
|
-
blockquote{
|
|
249
|
-
font-family:var(--serif);font-size:clamp(20px,2.4vw,27px);line-height:1.65;
|
|
250
|
-
letter-spacing:.01em;color:var(--ink);max-width:30em;margin:36px 0;padding-left:26px;
|
|
251
|
-
border-left:1px solid var(--line-strong);position:relative;
|
|
252
|
-
}
|
|
253
|
-
blockquote::before{content:"“";position:absolute;left:14px;top:-14px;font-size:42px;color:var(--rust);opacity:.35}
|
|
254
|
-
blockquote cite{display:block;margin-top:14px;font-family:var(--mono);font-style:normal;font-size:10.5px;letter-spacing:.06em;color:var(--faint)}
|
|
255
|
-
|
|
256
|
-
/* lists */
|
|
257
|
-
.bullets{display:flex;flex-direction:column;gap:10px;margin:18px 0;max-width:46em}
|
|
258
|
-
.bullets li{position:relative;padding-left:20px;font-size:15px;line-height:1.8;color:var(--ink-2)}
|
|
259
|
-
.bullets li::before{content:"";position:absolute;left:2px;top:.72em;width:5px;height:5px;background:var(--rust);border-radius:50%}
|
|
260
|
-
.bullets.tight li{font-size:14px}
|
|
261
|
-
.numlist{counter-reset:n;display:flex;flex-direction:column;gap:20px;margin:22px 0}
|
|
262
|
-
.numlist li{counter-increment:n;display:grid;grid-template-columns:38px 1fr;gap:14px;align-items:start}
|
|
263
|
-
.numlist li::before{
|
|
264
|
-
content:counter(n,decimal-leading-zero);font-family:var(--mono);font-size:11px;
|
|
265
|
-
color:var(--rust);padding-top:4px;border-top:1px solid var(--rust);
|
|
266
|
-
}
|
|
267
|
-
.numlist h4{margin-bottom:5px;font-size:15.5px}
|
|
268
|
-
.numlist p{font-size:14px;line-height:1.78;color:var(--muted);max-width:44em}
|
|
269
|
-
|
|
270
|
-
/* ============ charts ============ */
|
|
271
|
-
figure.chart{margin:30px 0;border:1px solid var(--line);background:var(--card);padding:24px}
|
|
272
|
-
figcaption{font-family:var(--mono);font-size:10px;letter-spacing:.08em;color:var(--faint);margin-top:14px;line-height:1.6;text-transform:uppercase}
|
|
273
|
-
figcaption b{color:var(--muted);font-weight:500}
|
|
274
|
-
.bar-row{display:grid;grid-template-columns:132px 1fr 64px;gap:12px;align-items:center;padding:9px 0;border-bottom:1px dashed var(--line)}
|
|
275
|
-
.bar-row:last-of-type{border-bottom:0}
|
|
276
|
-
.bar-lab{font-size:11.5px;line-height:1.35;color:var(--ink-2)}
|
|
277
|
-
.bar-lab span{display:block;font-family:var(--mono);font-size:8.5px;letter-spacing:.06em;color:var(--faint);margin-top:2px}
|
|
278
|
-
.bar-track{height:16px;background:var(--paper-2);position:relative}
|
|
279
|
-
.bar-fill{height:100%;background:var(--rust);transition:width 1s var(--ease)}
|
|
280
|
-
.bar-fill.t{background:var(--teal)}
|
|
281
|
-
.bar-fill.g{background:var(--gold)}
|
|
282
|
-
.bar-fill.k{background:var(--ink)}
|
|
283
|
-
.bar-val{font-family:var(--mono);font-size:11px;text-align:right;color:var(--ink);font-variant-numeric:tabular-nums}
|
|
284
|
-
|
|
285
|
-
/* ============ timeline ============ */
|
|
286
|
-
.tl{position:relative;margin:30px 0 10px;padding-left:26px}
|
|
287
|
-
.tl::before{content:"";position:absolute;left:4px;top:6px;bottom:6px;width:1px;background:var(--line-strong)}
|
|
288
|
-
.tl-item{position:relative;padding:0 0 26px 0}
|
|
289
|
-
.tl-item::before{content:"";position:absolute;left:-26px;top:7px;width:9px;height:9px;border:1px solid var(--rust);background:var(--paper);border-radius:50%}
|
|
290
|
-
.tl-item.fill::before{background:var(--rust)}
|
|
291
|
-
.tl-date{font-family:var(--mono);font-size:10px;letter-spacing:.08em;color:var(--rust);display:block;margin-bottom:3px}
|
|
292
|
-
.tl-item h4{font-size:14.5px;margin-bottom:3px}
|
|
293
|
-
.tl-item p{font-size:13px;line-height:1.7;color:var(--muted);max-width:44em}
|
|
294
|
-
|
|
295
|
-
/* ============ architecture ============ */
|
|
296
|
-
.arch{background:var(--dark);color:#e6e3da;padding:52px 48px;margin:38px 0}
|
|
297
|
-
.arch .arch-kicker{font-family:var(--mono);font-size:9.5px;letter-spacing:.18em;color:var(--gold);text-transform:uppercase;margin-bottom:26px}
|
|
298
|
-
.layer{display:grid;grid-template-columns:118px 1fr;gap:20px;align-items:center;padding:15px 0;border-bottom:1px solid rgba(255,255,255,.1)}
|
|
299
|
-
.layer:last-of-type{border-bottom:0}
|
|
300
|
-
.layer-tag{font-family:var(--mono);font-size:9px;letter-spacing:.1em;color:#8d9198;text-transform:uppercase}
|
|
301
|
-
.layer-body{display:flex;gap:10px;flex-wrap:wrap;align-items:center}
|
|
302
|
-
.chip{border:1px solid rgba(255,255,255,.24);padding:7px 12px;font-size:12px;line-height:1.3;color:#dedbd2;background:rgba(255,255,255,.03)}
|
|
303
|
-
.chip.hi{border-color:var(--gold);color:#f0e2bb;background:rgba(201,162,39,.08)}
|
|
304
|
-
.chip.dim{color:#8d9198;border-style:dashed}
|
|
305
|
-
.arrow{color:#5b6068;font-size:14px;margin:0 2px}
|
|
306
|
-
.arch-note{font-size:11.5px;color:#8d9198;line-height:1.7;margin-top:22px;font-family:var(--mono);max-width:70ch}
|
|
307
|
-
|
|
308
|
-
/* phase */
|
|
309
|
-
.phases{display:grid;grid-template-columns:repeat(4,1fr);gap:0;border:1px solid var(--line);background:var(--card);margin:28px 0}
|
|
310
|
-
.phase{padding:20px 18px;border-right:1px solid var(--line)}
|
|
311
|
-
.phase:last-child{border-right:0}
|
|
312
|
-
.phase .p-dur{font-family:var(--mono);font-size:9px;letter-spacing:.1em;color:var(--faint);text-transform:uppercase}
|
|
313
|
-
.phase h4{margin:8px 0 6px;font-size:14px}
|
|
314
|
-
.phase p{font-size:12px;line-height:1.65;color:var(--muted)}
|
|
315
|
-
.phase .p-out{margin-top:10px;font-size:11px;color:var(--teal);font-family:var(--mono);line-height:1.5}
|
|
316
|
-
.phase.p1{border-top:2px solid var(--rust)}
|
|
317
|
-
.phase.p2{border-top:2px solid var(--gold)}
|
|
318
|
-
.phase.p3{border-top:2px solid var(--teal)}
|
|
319
|
-
.phase.p4{border-top:2px solid var(--ink)}
|
|
320
|
-
|
|
321
|
-
/* footer */
|
|
322
|
-
footer{margin-top:80px;border-top:1px solid var(--line);padding:34px 0 64px;display:flex;justify-content:space-between;gap:24px;flex-wrap:wrap;font-family:var(--mono);font-size:10.5px;color:var(--faint);line-height:1.7}
|
|
323
|
-
footer b{color:var(--muted);font-weight:500}
|
|
324
|
-
|
|
325
|
-
/* route */
|
|
326
|
-
.route{display:grid;grid-template-columns:58px 1fr;gap:20px;padding:32px 0 26px;border-top:1px solid var(--line)}
|
|
327
|
-
.route:last-of-type{border-bottom:1px solid var(--line)}
|
|
328
|
-
.route-badge{font-family:var(--mono);font-size:30px;line-height:1;color:var(--rust);letter-spacing:-.06em;padding-top:2px}
|
|
329
|
-
.route-head{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;margin-bottom:9px}
|
|
330
|
-
.route-head h3{font-size:21px;letter-spacing:-.02em}
|
|
331
|
-
.route p{max-width:52em}
|
|
332
|
-
.route-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:18px}
|
|
333
|
-
.route-cell{border-top:1px solid var(--line-strong);padding-top:9px}
|
|
334
|
-
.route-cell dt{font-family:var(--mono);font-size:8.5px;letter-spacing:.12em;color:var(--faint);text-transform:uppercase;margin-bottom:5px}
|
|
335
|
-
.route-cell dd{margin:0;font-size:12.5px;line-height:1.68;color:var(--ink-2)}
|
|
336
|
-
.route-cell dd b{color:var(--rust);font-weight:600}
|
|
337
|
-
|
|
338
|
-
/* anti pattern */
|
|
339
|
-
.anti{display:grid;grid-template-columns:44px 1fr;gap:16px;padding:20px 0;border-top:1px solid var(--line)}
|
|
340
|
-
.anti:last-of-type{border-bottom:1px solid var(--line)}
|
|
341
|
-
.anti-n{font-family:var(--mono);font-size:10px;letter-spacing:.08em;color:var(--faint);padding-top:5px}
|
|
342
|
-
.anti h4{font-size:15.5px;margin-bottom:5px;display:flex;gap:9px;align-items:baseline;flex-wrap:wrap}
|
|
343
|
-
.anti p{font-size:13.5px;line-height:1.75;color:var(--muted);max-width:52em}
|
|
344
|
-
.anti .ex{margin-top:7px;font-size:12px;color:var(--teal);line-height:1.6}
|
|
345
|
-
.anti .ex b{font-family:var(--mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase;margin-right:5px}
|
|
346
|
-
|
|
347
|
-
/* matrix score */
|
|
348
|
-
.num-cell{display:flex;align-items:center;gap:8px}
|
|
349
|
-
.num-cell b{font-family:var(--mono);font-size:12px;width:9px;text-align:right;font-weight:600}
|
|
350
|
-
.sc i{height:12px;width:5px}
|
|
351
|
-
.legend{display:flex;gap:18px;flex-wrap:wrap;font-size:11px;color:var(--faint);font-family:var(--mono);margin-top:-12px;margin-bottom:26px}
|
|
352
|
-
.m{display:inline-block;width:46px;height:6px;background:var(--line);vertical-align:middle;margin-right:7px;position:relative;top:-1px}
|
|
353
|
-
.m i{display:block;height:100%;background:var(--teal)}
|
|
354
|
-
.m.g i{background:var(--gold)}
|
|
355
|
-
.m.l i{background:var(--rust)}
|
|
356
|
-
.mv{font-family:var(--mono);font-size:10.5px;font-weight:600;color:var(--muted)}
|
|
357
|
-
|
|
358
|
-
@media (max-width:760px){
|
|
359
|
-
.route{grid-template-columns:1fr;gap:8px}
|
|
360
|
-
.route-grid{grid-template-columns:1fr}
|
|
361
|
-
.anti{grid-template-columns:1fr}
|
|
362
|
-
.anti-n{display:none}
|
|
363
|
-
}
|
|
364
|
-
/* reveal */
|
|
365
|
-
html.js .reveal{opacity:0;transform:translateY(16px);transition:opacity .7s var(--ease),transform .7s var(--ease)}
|
|
366
|
-
html.js .reveal.in{opacity:1;transform:none}
|
|
367
|
-
|
|
368
|
-
/* responsive */
|
|
369
|
-
@media (max-width:1180px){
|
|
370
|
-
.shell{padding:0 40px 0 44px}
|
|
371
|
-
.hero{grid-template-columns:1fr;gap:40px}
|
|
372
|
-
.ledger{max-width:400px}
|
|
373
|
-
}
|
|
374
|
-
@media (max-width:980px){
|
|
375
|
-
:root{--rail:0px}
|
|
376
|
-
.rail{position:fixed;inset:auto 0 0 0;width:100%;height:auto;flex-direction:row;align-items:center;padding:8px 14px;border-right:0;border-top:1px solid var(--line);overflow-x:auto;gap:14px;background:var(--paper)}
|
|
377
|
-
.brand,.nav-label,.rail-foot{display:none}
|
|
378
|
-
.nav ul{flex-direction:row;gap:14px}
|
|
379
|
-
.nav a{grid-template-columns:auto;font-size:11.5px;padding:4px 0;white-space:nowrap}
|
|
380
|
-
.nav a em{display:none}
|
|
381
|
-
.shell{margin-left:0;padding:0 24px 76px}
|
|
382
|
-
.hero{grid-template-columns:1fr;min-height:auto;padding:72px 0 48px;gap:40px}
|
|
383
|
-
.ledger{max-width:420px}
|
|
384
|
-
.sec-head{grid-template-columns:1fr;gap:10px}
|
|
385
|
-
.sec-num{border-top:0;padding-top:0}
|
|
386
|
-
.g4{grid-template-columns:repeat(2,1fr)}
|
|
387
|
-
.g3{grid-template-columns:1fr}
|
|
388
|
-
.phases{grid-template-columns:1fr 1fr}
|
|
389
|
-
.phase:nth-child(2){border-right:0}
|
|
390
|
-
.phase:nth-child(1),.phase:nth-child(2){border-bottom:1px solid var(--line)}
|
|
391
|
-
.arch{padding:32px 22px}
|
|
392
|
-
.layer{grid-template-columns:1fr;gap:8px}
|
|
393
|
-
}
|
|
394
|
-
@media (max-width:600px){
|
|
395
|
-
body{font-size:15.5px}
|
|
396
|
-
.g2,.g4{grid-template-columns:1fr}
|
|
397
|
-
.phases{grid-template-columns:1fr}
|
|
398
|
-
.phase{border-right:0;border-bottom:1px solid var(--line)}
|
|
399
|
-
.bar-row{grid-template-columns:96px 1fr 52px;gap:8px}
|
|
400
|
-
.shell{padding:0 18px 72px}
|
|
401
|
-
h1{letter-spacing:-.04em}
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
@media print{
|
|
405
|
-
#progress,.rail,.nav{display:none!important}
|
|
406
|
-
body{background:#fff;font-size:10.5pt}
|
|
407
|
-
.shell{margin:0;padding:0;max-width:none}
|
|
408
|
-
.shell>*{max-width:none}
|
|
409
|
-
.hero{min-height:auto;page-break-after:always}
|
|
410
|
-
.sec{page-break-inside:avoid;border-top:1px solid #ccc}
|
|
411
|
-
.card,.tbl-wrap,figure.chart,.arch{page-break-inside:avoid}
|
|
412
|
-
.reveal{opacity:1!important;transform:none!important}
|
|
413
|
-
a{text-decoration:none}
|
|
414
|
-
}
|
|
415
|
-
@media (prefers-reduced-motion:reduce){
|
|
416
|
-
html{scroll-behavior:auto}
|
|
417
|
-
*{transition:none!important;animation:none!important}
|
|
418
|
-
}
|
|
419
|
-
</style>
|
|
420
|
-
<script>document.documentElement.classList.add('js');</script>
|
|
421
|
-
</head>
|
|
422
|
-
<body>
|
|
423
|
-
<div id="progress"></div>
|
|
424
|
-
|
|
425
|
-
<aside class="rail">
|
|
426
|
-
<a class="brand" href="#top">
|
|
427
|
-
<span class="brand-mark"><i></i></span>
|
|
428
|
-
<span class="brand-txt"><b>MCP / Context</b><span>TECH DUE DILIGENCE · 2026</span></span>
|
|
429
|
-
</a>
|
|
430
|
-
<nav class="nav" aria-label="目录">
|
|
431
|
-
<div class="nav-label">Contents</div>
|
|
432
|
-
<ul>
|
|
433
|
-
<li><a href="#s0"><em>00</em><span>结论先行</span></a></li>
|
|
434
|
-
<li><a href="#s1"><em>01</em><span>背景:税从哪来</span></a></li>
|
|
435
|
-
<li><a href="#s2"><em>02</em><span>四类 Token 成本</span></a></li>
|
|
436
|
-
<li><a href="#s3"><em>03</em><span>技术原理</span></a></li>
|
|
437
|
-
<li><a href="#s4"><em>04</em><span>2026 前沿图谱</span></a></li>
|
|
438
|
-
<li><a href="#s5"><em>05</em><span>亮点作品</span></a></li>
|
|
439
|
-
<li><a href="#s6"><em>06</em><span>成功样例</span></a></li>
|
|
440
|
-
<li><a href="#s7"><em>07</em><span>失败样例</span></a></li>
|
|
441
|
-
<li><a href="#s8"><em>08</em><span>可行路线</span></a></li>
|
|
442
|
-
<li><a href="#s9"><em>09</em><span>不可行路线</span></a></li>
|
|
443
|
-
<li><a href="#s10"><em>10</em><span>方案对比</span></a></li>
|
|
444
|
-
<li><a href="#s11"><em>11</em><span>推荐架构</span></a></li>
|
|
445
|
-
<li><a href="#s12"><em>12</em><span>落地路线图</span></a></li>
|
|
446
|
-
<li><a href="#s13"><em>13</em><span>建议</span></a></li>
|
|
447
|
-
<li><a href="#refs"><em>14</em><span>参考与口径</span></a></li>
|
|
448
|
-
</ul>
|
|
449
|
-
</nav>
|
|
450
|
-
<div class="rail-foot">
|
|
451
|
-
<b>数据截至</b><br>2026-10-21<br><br>
|
|
452
|
-
<b>样本</b><br>MCP 规范 2026-07-28<br>Registry 36,134 条
|
|
453
|
-
</div>
|
|
454
|
-
</aside>
|
|
455
|
-
|
|
456
|
-
<main class="shell" id="top">
|
|
457
|
-
|
|
458
|
-
<!-- ================= HERO ================= -->
|
|
459
|
-
<header class="hero">
|
|
460
|
-
<div>
|
|
461
|
-
<div class="kicker">技术尽调 · Agent 工具层</div>
|
|
462
|
-
<h1>MCP 的<span class="l2">Token <em>税</em></span></h1>
|
|
463
|
-
<p class="dek">模型还没开始干活,<b>超过四分之一的上下文</b>就已经被工具说明书吃掉了。这不是某一个服务器的 bug,而是“把一切能力都塞进提示词”这条路线的结构性成本。本报告拆解这笔账,并回答一个问题:下一个工具协议,应该长什么样。</p>
|
|
464
|
-
<div class="hero-meta">
|
|
465
|
-
<span>2026 年 10 月</span><i></i>
|
|
466
|
-
<span>约 1.3 万字</span><i></i>
|
|
467
|
-
<span>15 个章节</span><i></i>
|
|
468
|
-
<span>40+ 条外部证据</span>
|
|
469
|
-
</div>
|
|
470
|
-
</div>
|
|
471
|
-
<div class="ledger">
|
|
472
|
-
<div class="ledger-head"><b>Context Window</b><span>200K</span></div>
|
|
473
|
-
<div class="window" role="img" aria-label="200K 上下文窗口中,系统提示占 24K,GitHub 占 26K,Slack 与其余三个服务器占 29K,剩余 121K">
|
|
474
|
-
<div class="win-seg s-sys"><span>系统提示 <b>24K</b></span><span class="pct">12%</span></div>
|
|
475
|
-
<div class="win-seg s-github"><span>GitHub <b>26K</b> · 35 tools</span><span class="pct">13%</span></div>
|
|
476
|
-
<div class="win-seg s-other"><span>Slack + 3 个服务 <b>29K</b></span><span class="pct">15%</span></div>
|
|
477
|
-
<div class="win-seg s-free"><span>留给任务 <b>121K</b></span><span class="pct">60%</span></div>
|
|
478
|
-
</div>
|
|
479
|
-
<div class="ledger-scale"><span>0</span><span>100K</span><span>200K</span></div>
|
|
480
|
-
<p class="ledger-note">按 Anthropic 2025-11 公开的五服务器口径:58 个工具约 55K tokens(GitHub 26K、Slack 21K、其余 8K)。更广为人知的另一组数字是 GitHub 单服务器 93 工具约 55K(2025-08 估算),2026-08 复测已降至 85 工具 / 26.6K。</p>
|
|
481
|
-
</div>
|
|
482
|
-
</header>
|
|
483
|
-
|
|
484
|
-
<!-- ================= 00 SUMMARY ================= -->
|
|
485
|
-
<section class="sec" id="s0">
|
|
486
|
-
<div class="sec-head">
|
|
487
|
-
<div class="sec-num">00 / SUMMARY</div>
|
|
488
|
-
<h2>结论先行<span class="sub">如果只看一页,看这五条。</span></h2>
|
|
489
|
-
</div>
|
|
490
|
-
|
|
491
|
-
<div class="callout dark reveal">
|
|
492
|
-
<h4>核心判断</h4>
|
|
493
|
-
<p style="font-size:17px;line-height:1.8;color:#eeebe2">MCP 的问题不在“协议编码”,而在“上下文装配策略”。因此,<b style="color:#f0c987">推倒重写一个新协议,收益极低;重新设计工具与模型之间的“上下文平面”,收益极高。</b>后者的工程量小一个量级,且不必赢下网络效应。</p>
|
|
494
|
-
</div>
|
|
495
|
-
|
|
496
|
-
<div class="numlist">
|
|
497
|
-
<li class="reveal">
|
|
498
|
-
<div><h4>成本有四类,优先级截然不同</h4>
|
|
499
|
-
<p>定义税(每轮固定)、结果税(随轮次二次增长)、往返税(每步一次推理)、协议税(握手与状态)。<b>在数据密集型任务里,结果税最贵</b>,却最少被讨论;定义税最显眼,所以被过度优化。</p></div>
|
|
500
|
-
</li>
|
|
501
|
-
<li class="reveal">
|
|
502
|
-
<div><h4>2026 年的答案已经收敛为三个动作</h4>
|
|
503
|
-
<p>推迟(defer):工具定义按需加载;外置(externalize):执行搬进沙箱,中间结果不回上下文;压缩(compress):结果换一种编码、换一个粒度。三者可叠加,不互斥。</p></div>
|
|
504
|
-
</li>
|
|
505
|
-
<li class="reveal">
|
|
506
|
-
<div><h4>最强证据来自“不改协议”的方案</h4>
|
|
507
|
-
<p>Anthropic 的工具检索在 API 侧把 72K 降到 8.7K(−85%),准确率反升 25 个百分点;Cloudflare 的 Code Mode 用约 1,000 tokens 覆盖 2,594 个端点。两者都没有修改 MCP 的线上格式。</p></div>
|
|
508
|
-
</li>
|
|
509
|
-
<li class="reveal">
|
|
510
|
-
<div><h4>“新协议”唯一可行的形态是剖面(profile)</h4>
|
|
511
|
-
<p>南向继续讲 MCP(36,134 条 registry 条目、13,087 个可用端点),北向只对模型暴露 3–5 个元工具加一份签名清单。把创新放在运行时,而不是替换插座。</p></div>
|
|
512
|
-
</li>
|
|
513
|
-
<li class="reveal">
|
|
514
|
-
<div><h4>先做计量,再做优化</h4>
|
|
515
|
-
<p>没有 per-server / per-turn 的 token 账本,任何“省 token”的结论都是猜测。建议把“每轮工具预算”做成产品的一等公民,而不是事后调参。</p></div>
|
|
516
|
-
</li>
|
|
517
|
-
</div>
|
|
518
|
-
|
|
519
|
-
<div class="grid g4" style="margin-top:46px">
|
|
520
|
-
<div class="stat red reveal"><b>55<small>K</small></b><span>五个服务器、58 个工具的定义开销,占 200K 窗口的 27%</span></div>
|
|
521
|
-
<div class="stat red reveal"><b>134<small>K</small></b><span>Anthropic 内部观测到的工具定义峰值,发生在对话开始之前</span></div>
|
|
522
|
-
<div class="stat teal reveal"><b>−85<small>%</small></b><span>Tool Search Tool 的定义 token 降幅,同时准确率 49%→74%</span></div>
|
|
523
|
-
<div class="stat teal reveal"><b>98.7<small>%</small></b><span>代码执行模式下,一个多服务器工作流的 token 降幅(150K→2K)</span></div>
|
|
524
|
-
</div>
|
|
525
|
-
<p class="tbl-note" style="margin-top:14px">口径见第 02、04 节。55K 为 Anthropic 2025-11 公布的五服务器合计(GitHub 单服务器另有 2025-08 的 93 工具 / 55K 估算,2026-08 复测降至 85 工具 / 26.6K);134K 与 98.7% 为厂商自述;−85% 为 Anthropic 官方基准。</p>
|
|
526
|
-
</section>
|
|
527
|
-
|
|
528
|
-
<!-- ================= 01 BACKGROUND ================= -->
|
|
529
|
-
<section class="sec" id="s1">
|
|
530
|
-
<div class="sec-head">
|
|
531
|
-
<div class="sec-num">01 / BACKGROUND</div>
|
|
532
|
-
<h2>“AI 的 USB-C”,插满了会短路<span class="sub">MCP 用两年时间解决了 N×M 的集成问题,也顺手把集成成本搬进了上下文窗口。</span></h2>
|
|
533
|
-
</div>
|
|
534
|
-
|
|
535
|
-
<p class="lead">2024 年 11 月,Anthropic 发布 Model Context Protocol,用 JSON-RPC 统一了模型与外部工具、数据源的连接方式。这个类比很成功:MCP 是 USB-C,任何客户端插上任何服务器都能用。到 2026 年 9 月,官方 registry 已收录 <span class="hl">36,134 条</span>服务器条目、<span class="hl">22,151 个</span>远程端点。</p>
|
|
536
|
-
|
|
537
|
-
<p>但 USB-C 的类比漏掉了一件事:现实里的 USB-C 插上就能用,而 MCP 每插一个设备,都必须把该设备的完整说明书——每个工具的名字、描述、JSON Schema、枚举、嵌套对象——<strong>抄进模型的提示词里</strong>。插十个设备,就抄十份说明书。这些说明书在每一轮对话中都要重新计费、重新占用注意力。</p>
|
|
538
|
-
|
|
539
|
-
<blockquote>
|
|
540
|
-
工具不是免费的。每一个工具定义都是一段永久驻留的提示词,而提示词的长度,就是模型注意力的税率。
|
|
541
|
-
<cite>— 本报告的核心观察</cite>
|
|
542
|
-
</blockquote>
|
|
543
|
-
|
|
544
|
-
<h3 style="margin:44px 0 8px">三场同时发生的爆炸</h3>
|
|
545
|
-
<p style="margin-bottom:26px">单独看,任何一场爆炸都可控;三者叠加,才让 2026 年的 Agent 陷入“工具越多、表现越差”的困境。</p>
|
|
546
|
-
|
|
547
|
-
<div class="grid g3">
|
|
548
|
-
<div class="card reveal">
|
|
549
|
-
<span class="idx">EXPLOSION 01</span>
|
|
550
|
-
<h4>工具数量爆炸</h4>
|
|
551
|
-
<p>一个 GitHub 服务器就有近百个工具;Jira 一家约 17K tokens;企业内部动辄数十个 SaaS、数百个 API。工具从“几个函数”变成“一个应用商店”。</p>
|
|
552
|
-
<div class="why"><b>后果</b>:定义税从数百 token 涨到数万 token。</div>
|
|
553
|
-
</div>
|
|
554
|
-
<div class="card reveal">
|
|
555
|
-
<span class="idx">EXPLOSION 02</span>
|
|
556
|
-
<h4>结果体积爆炸</h4>
|
|
557
|
-
<p>工具返回的不再是状态码,而是日志、表格、代码库检索结果、PDF 解析文本。一次调用返回 200KB 原始数据是常态,而模型真正需要的往往只是 1KB 的聚合结论。</p>
|
|
558
|
-
<div class="why"><b>后果</b>:结果税随任务轮次<strong>二次增长</strong>。</div>
|
|
559
|
-
</div>
|
|
560
|
-
<div class="card reveal">
|
|
561
|
-
<span class="idx">EXPLOSION 03</span>
|
|
562
|
-
<h4>任务步数爆炸</h4>
|
|
563
|
-
<p>Agent 从“一问一答”变成 20–50 步的循环。每一步都是一次完整推理,都要重放此前全部上下文。20 次工具调用意味着 20 次推理,而非 1 次。</p>
|
|
564
|
-
<div class="why"><b>后果</b>:往返税与时延线性叠加。</div>
|
|
565
|
-
</div>
|
|
566
|
-
</div>
|
|
567
|
-
|
|
568
|
-
<h3 style="margin:52px 0 10px">繁荣的另一面: registry 的真实质量</h3>
|
|
569
|
-
<p>2026 年 9 月,Council of AI 对官方 registry 与 Docker 目录做了一次全量探测:22,196 个远程端点中,只有 <strong>13,087 个真正以 MCP 协议应答</strong>;4,948 个要求认证,1,411 个应答但根本不是 MCP,1,259 个不可达。更值得警惕的是“自述一致性”——在 5,828 个可比对端点中,<strong>47.4% 至少有一个维度自相矛盾</strong>(版本号最常见,其次是工具列表)。</p>
|
|
570
|
-
|
|
571
|
-
<div class="grid g4" style="margin:30px 0 8px">
|
|
572
|
-
<div class="stat"><b>36,134</b><span>registry 条目(2026-09)</span></div>
|
|
573
|
-
<div class="stat"><b>22,151</b><span>去重后的远程端点</span></div>
|
|
574
|
-
<div class="stat red"><b>13,087</b><span>真正以 MCP 应答的端点,约 59%</span></div>
|
|
575
|
-
<div class="stat red"><b>47.4<small>%</small></b><span>公共描述至少一处自相矛盾</span></div>
|
|
576
|
-
</div>
|
|
577
|
-
<p class="tbl-note">数据来源:Council of AI《State of the Agent Internet: September 2026》,2026-09-26。该机构为商业测量方,方法论与原始记录公开可复核;此处仅引用其计数,不采纳其评级。</p>
|
|
578
|
-
|
|
579
|
-
<p style="margin-top:22px">另一个维度是“用得多深”。Stacklok 与 AAIF 在 2026 年中的一项调查(100 名工程师)显示:41% 的软件组织声称 MCP 已进入生产,但 <strong>86% 的使用仍停留在实验或本地阶段</strong>,只有 5% 在企业范围内被治理,49% 把安全列为首要阻碍。这与“MCP 已死”的论调恰好相反——它不是没人用,而是<strong>用得很浅、管得很松</strong>。</p>
|
|
580
|
-
|
|
581
|
-
<div class="callout teal">
|
|
582
|
-
<h4>这意味着什么</h4>
|
|
583
|
-
<p>“工具很多”并不等于“能力很强”。当近半数服务器的自述与行为不一致时,客户端为了容错,只能倾向于<strong>多加载、多暴露、多重试</strong>——每一个容错动作,最终都会变成 token。生态的碎片化,才是 token 浪费的上游原因。</p>
|
|
584
|
-
</div>
|
|
585
|
-
</section>
|
|
586
|
-
|
|
587
|
-
<!-- ================= 02 COST ANATOMY ================= -->
|
|
588
|
-
<section class="sec" id="s2">
|
|
589
|
-
<div class="sec-head">
|
|
590
|
-
<div class="sec-num">02 / COST</div>
|
|
591
|
-
<h2>四类 Token 成本,和一张被算错的账<span class="sub">大多数团队只盯着“工具定义”,却忽略了真正会复利的那一项。</span></h2>
|
|
592
|
-
</div>
|
|
593
|
-
|
|
594
|
-
<p class="lead">把一次 Agent 任务的账单拆开,会看到四种性质完全不同的成本。它们的最优解法互相冲突,因此必须分开度量、分别优化。</p>
|
|
595
|
-
|
|
596
|
-
<div class="grid g2" style="margin:30px 0">
|
|
597
|
-
<div class="card reveal" style="border-top:2px solid var(--rust)">
|
|
598
|
-
<span class="idx">TAX 01 · FIXED, PER TURN</span>
|
|
599
|
-
<h4>定义税:每轮都要重交的“说明书费”</h4>
|
|
600
|
-
<p>所有已连接服务器的工具 schema,在每一轮推理前被序列化进系统提示。它是<strong>固定成本</strong>:无论这轮是否用到,都要付费;也是<strong>缓存友好</strong>的:只要工具集不变,prompt cache 可以摊薄。</p>
|
|
601
|
-
<div class="why"><b>口径</b>:五服务器 58 工具 ≈55K(Anthropic);GitHub 单服务器 2025-08 估算 93 工具 ≈55K,2026-08 复测为 85 工具 26.6K、默认 44 工具 14.2K;Anthropic 内部峰值 134K。</div>
|
|
602
|
-
</div>
|
|
603
|
-
<div class="card reveal" style="border-top:2px solid var(--rust)">
|
|
604
|
-
<span class="idx">TAX 02 · VARIABLE, QUADRATIC</span>
|
|
605
|
-
<h4>结果税:会复利的“数据搬运费”</h4>
|
|
606
|
-
<p>工具返回的原始 JSON 进入上下文后,不会被自动遗忘。第 3 轮取回的 200KB 日志,在第 4、5、6…轮仍要重放。<strong>N 步任务的结果成本约为 O(N²)</strong>,这是最被低估的一项。</p>
|
|
607
|
-
<div class="why"><b>实测</b>:某预算核查任务,2,000+ 条明细(50KB+)全部入上下文;改用代码编排后仅回传 1KB。</div>
|
|
608
|
-
</div>
|
|
609
|
-
<div class="card reveal" style="border-top:2px solid var(--gold)">
|
|
610
|
-
<span class="idx">TAX 03 · LATENCY</span>
|
|
611
|
-
<h4>往返税:每一步都要“重新思考一遍”</h4>
|
|
612
|
-
<p>自然语言工具调用要求每次调用都回到模型:读结果、判断、再决策。20 次调用 = 20 次推理,每次都要处理整个上下文。它主要不烧钱,烧的是<strong>时延与错误率</strong>——每次往返都是一次新的出错机会。</p>
|
|
613
|
-
<div class="why"><b>实测</b>:代码编排 20+ 次调用可省去 19 次推理往返。</div>
|
|
614
|
-
</div>
|
|
615
|
-
<div class="card reveal" style="border-top:2px solid var(--line-strong)">
|
|
616
|
-
<span class="idx">TAX 04 · PROTOCOL</span>
|
|
617
|
-
<h4>协议税:握手、会话与“不该存在的状态”</h4>
|
|
618
|
-
<p>initialize 握手、Mcp-Session-Id、SSE 重连、能力协商——单个请求的开销不大,但它们让缓存失效、让水平扩展变难、让“无状态重试”变得昂贵。2026-07-28 版规范把它们删了,恰好证明这部分是历史包袱。</p>
|
|
619
|
-
<div class="why"><b>变化</b>:新规范改为无状态请求 + <code>server/discover</code> + 可缓存列表(<code>ttlMs</code>)。</div>
|
|
620
|
-
</div>
|
|
621
|
-
</div>
|
|
622
|
-
|
|
623
|
-
<div class="callout">
|
|
624
|
-
<h4>为什么“结果税”比“定义税”更致命</h4>
|
|
625
|
-
<p>定义税是线性的:第 N 轮付 N 次同样的钱,可以用 prompt cache 打到一折。结果税是二次的:每一轮新增的结果,都会在后续所有轮次中被重复计费。以 55K 定义、每轮 10K 结果、20 轮为例:定义累计约 <strong>1.1M</strong>,结果累计约 <strong>2.1M</strong>,<span class="hl">第 11 轮起结果反超</span>;若单次结果 50K(约一份 200KB 文档),结果累计 10.5M,是定义的 9.5 倍。优化顺序因此应当是:<span class="hl">先结果,后定义,再往返</span>。</p>
|
|
626
|
-
</div>
|
|
627
|
-
|
|
628
|
-
<div style="margin:34px 0 6px;border-top:1px solid var(--line-strong);padding-top:22px">
|
|
629
|
-
<div style="display:flex;justify-content:space-between;align-items:baseline;margin-bottom:16px;gap:12px;flex-wrap:wrap">
|
|
630
|
-
<div class="mono" style="font-size:10px;letter-spacing:.12em;color:var(--faint);text-transform:uppercase">单个服务器的定义 token 分布 · 12,722 个服务器 / 251,000 个工具</div>
|
|
631
|
-
<div class="mono" style="font-size:9px;color:var(--faint)">2026-10 审计</div>
|
|
632
|
-
</div>
|
|
633
|
-
<div class="grid g4">
|
|
634
|
-
<div class="stat"><b>1,862</b><span>中位数</span></div>
|
|
635
|
-
<div class="stat red"><b>13,674</b><span>p90</span></div>
|
|
636
|
-
<div class="stat red"><b>39,523</b><span>p99</span></div>
|
|
637
|
-
<div class="stat red"><b>442,047</b><span>最大值</span></div>
|
|
638
|
-
</div>
|
|
639
|
-
</div>
|
|
640
|
-
<p class="tbl-note" style="margin-top:14px">“平均每个服务器还好”是一种幻觉:分布极度长尾,少数巨型服务器决定了整张账单。GitHub + Linear + Supabase 三个合计 24,116 tokens,已占 200K 窗口的 12%。来源:PolicyLayer 逐轮 schema 审计,2026-10-20。</p>
|
|
641
|
-
|
|
642
|
-
<figure class="chart reveal">
|
|
643
|
-
<div style="display:flex;justify-content:space-between;align-items:baseline;margin-bottom:18px">
|
|
644
|
-
<div style="font-family:var(--mono);font-size:10px;letter-spacing:.12em;color:var(--faint);text-transform:uppercase">Fig. 01 — 每轮工具相关上下文</div>
|
|
645
|
-
<div style="font-family:var(--mono);font-size:9px;color:var(--faint)">单位:tokens</div>
|
|
646
|
-
</div>
|
|
647
|
-
<div class="bar-row">
|
|
648
|
-
<div class="bar-lab">全量注入<span>50+ MCP tools</span></div>
|
|
649
|
-
<div class="bar-track"><div class="bar-fill" style="width:100%"></div></div>
|
|
650
|
-
<div class="bar-val">72,000</div>
|
|
651
|
-
</div>
|
|
652
|
-
<div class="bar-row">
|
|
653
|
-
<div class="bar-lab">工具检索<span>Tool Search</span></div>
|
|
654
|
-
<div class="bar-track"><div class="bar-fill t" style="width:12.1%"></div></div>
|
|
655
|
-
<div class="bar-val">8,700</div>
|
|
656
|
-
</div>
|
|
657
|
-
<div class="bar-row">
|
|
658
|
-
<div class="bar-lab">门控 + 懒加载<span>120-tool 模拟</span></div>
|
|
659
|
-
<div class="bar-track"><div class="bar-fill g" style="width:3.3%"></div></div>
|
|
660
|
-
<div class="bar-val">2,400</div>
|
|
661
|
-
</div>
|
|
662
|
-
<div class="bar-row">
|
|
663
|
-
<div class="bar-lab">代码模式<span>2,594 endpoints</span></div>
|
|
664
|
-
<div class="bar-track"><div class="bar-fill k" style="width:1.4%"></div></div>
|
|
665
|
-
<div class="bar-val">≈1,000</div>
|
|
666
|
-
</div>
|
|
667
|
-
<figcaption><b>口径不同,仅示意量级:</b>72K 为 Anthropic 对 50+ 工具的统计;8.7K 为其 Tool Search 开启后的总上下文占用(含系统提示);2.4K 为 arXiv 2604.21816 的模拟结果(非线上实测);1K 为 Cloudflare 对全部 API 端点的代码模式描述开销。</figcaption>
|
|
668
|
-
</figure>
|
|
669
|
-
|
|
670
|
-
<figure class="chart reveal">
|
|
671
|
-
<div style="display:flex;justify-content:space-between;align-items:baseline;margin-bottom:6px">
|
|
672
|
-
<div style="font-family:var(--mono);font-size:10px;letter-spacing:.12em;color:var(--faint);text-transform:uppercase">Fig. 02 — 结果在上下文中被重放的累计量</div>
|
|
673
|
-
<div style="font-family:var(--mono);font-size:9px;color:var(--faint)">单位:K tokens</div>
|
|
674
|
-
</div>
|
|
675
|
-
<svg viewBox="0 0 720 260" width="100%" role="img" aria-label="累计重放曲线:全量回传在20轮时达到420K,代码模式仅4K">
|
|
676
|
-
<g stroke="#ddd8ca" stroke-width="1">
|
|
677
|
-
<line x1="60" y1="220" x2="700" y2="220"/>
|
|
678
|
-
<line x1="60" y1="170" x2="700" y2="170" stroke-dasharray="2 4"/>
|
|
679
|
-
<line x1="60" y1="120" x2="700" y2="120" stroke-dasharray="2 4"/>
|
|
680
|
-
<line x1="60" y1="70" x2="700" y2="70" stroke-dasharray="2 4"/>
|
|
681
|
-
<line x1="60" y1="20" x2="700" y2="20" stroke-dasharray="2 4"/>
|
|
682
|
-
</g>
|
|
683
|
-
<g font-family="ui-monospace,Consolas,monospace" font-size="9" fill="#8d9198">
|
|
684
|
-
<text x="50" y="223" text-anchor="end">0</text>
|
|
685
|
-
<text x="50" y="173" text-anchor="end">105</text>
|
|
686
|
-
<text x="50" y="123" text-anchor="end">210</text>
|
|
687
|
-
<text x="50" y="73" text-anchor="end">315</text>
|
|
688
|
-
<text x="50" y="23" text-anchor="end">420</text>
|
|
689
|
-
<text x="60" y="240">1</text>
|
|
690
|
-
<text x="194" y="240">5</text>
|
|
691
|
-
<text x="329" y="240">10</text>
|
|
692
|
-
<text x="464" y="240">15</text>
|
|
693
|
-
<text x="700" y="240" text-anchor="end">20 轮</text>
|
|
694
|
-
</g>
|
|
695
|
-
<path d="M60,219 L93.7,217.1 L127.4,214.3 L161.1,210.5 L194.7,205.7 L228.4,200 L262.1,193.3 L295.8,185.7 L329.5,177.1 L363.2,167.6 L396.8,157.1 L430.5,145.7 L464.2,133.3 L497.9,120 L531.6,105.7 L565.3,90.5 L598.9,74.3 L632.6,57.1 L666.3,39 L700,20"
|
|
696
|
-
fill="none" stroke="#ac361c" stroke-width="2"/>
|
|
697
|
-
<path d="M60,219 L700,218.1" fill="none" stroke="#1c5b57" stroke-width="2"/>
|
|
698
|
-
<g font-family="-apple-system,Segoe UI,sans-serif" font-size="11">
|
|
699
|
-
<text x="560" y="34" fill="#ac361c">全量回传 · 420K</text>
|
|
700
|
-
<text x="470" y="209" fill="#1c5b57">代码模式 · 4K</text>
|
|
701
|
-
</g>
|
|
702
|
-
<circle cx="700" cy="20" r="3" fill="#ac361c"/>
|
|
703
|
-
<circle cx="700" cy="218.1" r="3" fill="#1c5b57"/>
|
|
704
|
-
</svg>
|
|
705
|
-
<figcaption><b>假设:</b>每轮工具结果 2K tokens(轻量场景)、不裁剪、全部重放;代码模式仅回传 0.2K 摘要。纵轴为“历史结果累计重放量”,不含定义税。<b>换算:</b>数据型任务把每轮结果换成 10K,20 轮累计即为 2.1M,第 11 轮起超过同期定义税(1.1M);换成 50K 则为 10.5M。</figcaption>
|
|
706
|
-
</figure>
|
|
707
|
-
</section>
|
|
708
|
-
|
|
709
|
-
<!-- ================= 03 THEORY ================= -->
|
|
710
|
-
<section class="sec" id="s3">
|
|
711
|
-
<div class="sec-head">
|
|
712
|
-
<div class="sec-num">03 / MECHANISM</div>
|
|
713
|
-
<h2>为什么“更多上下文”会让模型更笨<span class="sub">不是玄学,是注意力预算、检索干扰与错误恢复三件事的叠加。</span></h2>
|
|
714
|
-
</div>
|
|
715
|
-
|
|
716
|
-
<p class="lead">Token 只是账单的外显。真正让 Agent 变差的,是上下文变长之后,模型对“该看什么”失去了分辨率。</p>
|
|
717
|
-
|
|
718
|
-
<h3 style="margin:36px 0 12px">3.1 注意力是稀缺资源,不是免费容量</h3>
|
|
719
|
-
<p>Transformer 的注意力计算随序列长度平方增长,但更关键的是<strong>有效注意力被稀释</strong>:当上下文中混入大量与当前子目标无关的工具描述和历史结果时,模型对关键信息的召回率下降。业界把这一现象称为“context rot”(上下文腐化),并观察到当上下文利用率超过约 <strong>70%</strong> 后,推理质量出现非线性下滑——这个阈值来自一线工程经验,不同模型有差异,但方向一致。</p>
|
|
720
|
-
|
|
721
|
-
<p>Chroma 在 2025 年 7 月对 18 个模型做过一组对照实验:即使任务本身很简单,输入变长也会让表现下降;加入一个干扰项就有影响,四个干扰项叠加更明显;一段约 300 tokens 的聚焦提示,可以打赢 113K tokens 的全量提示。</p>
|
|
722
|
-
|
|
723
|
-
<p>这解释了一个反直觉的现象:把窗口从 200K 扩到 1M,并不能让 Agent 变强。窗口越大,注入的无关内容越多,信噪比反而越低;而成本按时长线性上涨。</p>
|
|
724
|
-
|
|
725
|
-
<h3 style="margin:40px 0 12px">3.2 工具越多,选错的概率越高</h3>
|
|
726
|
-
<p>工具选择是一个“在 N 个相似选项中做区分”的任务。当工具名高度相似时——比如 <code>notification-send-user</code> 与 <code>notification-send-channel</code>——模型必须在描述文本里找到那个决定性的差异词。工具越多、描述越长,这个差异词越容易被淹没。选错的代价不只是浪费一次调用:它会触发<strong>重试、澄清、回滚</strong>,每一次都是额外的推理轮次与上下文污染。</p>
|
|
727
|
-
|
|
728
|
-
<div class="callout teal">
|
|
729
|
-
<h4>因此,token 效率与任务成功率不是 trade-off</h4>
|
|
730
|
-
<p>Anthropic 的公开数据显示,开启工具检索后,Opus 4 在 MCP 评测上的准确率从 49% 提升到 74%,Opus 4.5 从 79.5% 提升到 88.1%——<strong>上下文更短,判断更准</strong>。这打破了“省 token 必然牺牲效果”的直觉:在工具过载区间,二者是同向的。</p>
|
|
731
|
-
</div>
|
|
732
|
-
|
|
733
|
-
<h3 style="margin:40px 0 12px">3.3 三个杠杆:推迟、外置、压缩</h3>
|
|
734
|
-
<p>所有有效的优化,最终都落在三个动作上。它们的组合,构成了下一代工具协议的全部设计空间。</p>
|
|
735
|
-
|
|
736
|
-
<div class="grid g3" style="margin:24px 0 10px">
|
|
737
|
-
<div class="card reveal">
|
|
738
|
-
<span class="idx">LEVER 01</span>
|
|
739
|
-
<h4>推迟 Defer</h4>
|
|
740
|
-
<p>不在第一轮加载全部定义。先给模型一份“目录摘要”,需要时再检索、展开完整 schema。本质是把“预加载”换成“按需分页”。</p>
|
|
741
|
-
<div class="why"><b>省的是</b>:定义税</div>
|
|
742
|
-
</div>
|
|
743
|
-
<div class="card reveal">
|
|
744
|
-
<span class="idx">LEVER 02</span>
|
|
745
|
-
<h4>外置 Externalize</h4>
|
|
746
|
-
<p>把编排逻辑与数据处理搬进沙箱。工具变成代码里的函数,中间结果留在沙箱,只有最终结论回到模型。本质是把“对话式调用”换成“程序式调用”。</p>
|
|
747
|
-
<div class="why"><b>省的是</b>:结果税 + 往返税</div>
|
|
748
|
-
</div>
|
|
749
|
-
<div class="card reveal">
|
|
750
|
-
<span class="idx">LEVER 03</span>
|
|
751
|
-
<h4>压缩 Compress</h4>
|
|
752
|
-
<p>改变结果的编码与粒度:结构化数组用更紧凑的格式、大结果转句柄按需切片、超长文本先摘要再入上下文。本质是提高“每 token 的信息密度”。</p>
|
|
753
|
-
<div class="why"><b>省的是</b>:结果税</div>
|
|
754
|
-
</div>
|
|
755
|
-
</div>
|
|
756
|
-
|
|
757
|
-
<p style="margin-top:26px">三个杠杆的工程属性完全不同:<strong>推迟</strong>是检索问题(召回率决定成败),<strong>外置</strong>是安全与运行时问题(沙箱隔离决定可行性),<strong>压缩</strong>是格式与信息论问题(可逆性决定风险)。把它们混为一谈,是大多数方案失败的起点。</p>
|
|
758
|
-
|
|
759
|
-
<blockquote>
|
|
760
|
-
优化的目标不是“用最少的 token”,而是在给定任务成功率下,找到上下文成本的最小值。这是一个帕累托前沿,不是一个单点。
|
|
761
|
-
<cite>— 设计原则</cite>
|
|
762
|
-
</blockquote>
|
|
763
|
-
</section>
|
|
764
|
-
|
|
765
|
-
<!-- ================= 04 LANDSCAPE ================= -->
|
|
766
|
-
<section class="sec" id="s4">
|
|
767
|
-
<div class="sec-head">
|
|
768
|
-
<div class="sec-num">04 / LANDSCAPE</div>
|
|
769
|
-
<h2>2026 前沿图谱:五种范式已经成型<span class="sub">过去 12 个月,行业没有发明新编码,而是把“什么时候给模型看什么”重新设计了一遍。</span></h2>
|
|
770
|
-
</div>
|
|
771
|
-
|
|
772
|
-
<p class="lead">下面这条时间线只收录对“上下文成本”有实质影响的事件。可以看到一个清晰的转向:2025 年大家在优化<strong>单次调用的格式</strong>,2026 年转向优化<strong>整个会话的信息流</strong>。</p>
|
|
773
|
-
|
|
774
|
-
<div class="tl">
|
|
775
|
-
<div class="tl-item fill reveal">
|
|
776
|
-
<span class="tl-date">2025-09</span>
|
|
777
|
-
<h4>Cloudflare 发布 Code Mode</h4>
|
|
778
|
-
<p>把 2,594 个 API 端点折叠成三个入口(<code>search</code> / <code>execute</code> / <code>docs</code>),模型写 TypeScript 在 isolate 中调用。全量 API 描述从约 117 万 tokens 降到约 1,000 tokens。</p>
|
|
779
|
-
</div>
|
|
780
|
-
<div class="tl-item reveal">
|
|
781
|
-
<span class="tl-date">2025-10</span>
|
|
782
|
-
<h4>Agent Skills:渐进披露进入“知识层”</h4>
|
|
783
|
-
<p>把技能写成文件,元数据(约 100 tokens)常驻,正文按需加载。它证明了“分层加载”不只适用于工具,也适用于说明书本身。</p>
|
|
784
|
-
</div>
|
|
785
|
-
<div class="tl-item fill reveal">
|
|
786
|
-
<span class="tl-date">2025-11-04</span>
|
|
787
|
-
<h4>Anthropic《Code execution with MCP》</h4>
|
|
788
|
-
<p>把 MCP 服务器暴露为文件树中的 TypeScript 模块,模型 <code>import</code> 后调用。示例工作流从 150K 降到 2K(−98.7%),并顺带把敏感数据留在沙箱内。</p>
|
|
789
|
-
</div>
|
|
790
|
-
<div class="tl-item fill reveal">
|
|
791
|
-
<span class="tl-date">2025-11</span>
|
|
792
|
-
<h4>Tool Search / Programmatic Tool Calling / Tool Use Examples</h4>
|
|
793
|
-
<p>三件套同时发布:检索式加载、代码内编排、以示例替代冗长描述。定义 72K→8.7K,准确率 49%→74%;PTC 让复杂研究任务 token 降 37%。</p>
|
|
794
|
-
</div>
|
|
795
|
-
<div class="tl-item reveal">
|
|
796
|
-
<span class="tl-date">2025-11-25</span>
|
|
797
|
-
<h4>MCP 规范: tasks 进入实验阶段</h4>
|
|
798
|
-
<p>长任务可以轮询取结果,不必阻塞等待;同时引入 URL 模式 elicitation、OAuth Client ID Metadata Documents。协议开始为“长时运行”做准备。</p>
|
|
799
|
-
</div>
|
|
800
|
-
<div class="tl-item reveal">
|
|
801
|
-
<span class="tl-date">2025-12</span>
|
|
802
|
-
<h4>MCP 转入 Linux Foundation 旗下的 Agentic AI Foundation</h4>
|
|
803
|
-
<p>治理中立化,与 goose、AGENTS.md 等一同托管。协议从此不再由单一厂商单方面定义,但路线图也更难激进。</p>
|
|
804
|
-
</div>
|
|
805
|
-
<div class="tl-item reveal">
|
|
806
|
-
<span class="tl-date">2026-04</span>
|
|
807
|
-
<h4>“Tool Attention”论文:把门控做成中间件</h4>
|
|
808
|
-
<p>用句向量算意图-工具重叠度,叠加状态门控与两阶段懒加载,在 120 工具模拟中把每轮 47.3K 降到 2.4K(−95%),上下文利用率 24%→91%。作者明确标注:端到端指标为投影,非线上实测。</p>
|
|
809
|
-
</div>
|
|
810
|
-
<div class="tl-item fill reveal">
|
|
811
|
-
<span class="tl-date">2026-07-28</span>
|
|
812
|
-
<h4>MCP 规范大改:删会话、去握手、加缓存</h4>
|
|
813
|
-
<p>移除 <code>initialize</code> 与 <code>Mcp-Session-Id</code>,改为无状态请求;新增 <code>server/discover</code>;列表结果必须带 <code>ttlMs</code> 与 <code>cacheScope</code>;要求 <code>tools/list</code> 稳定排序以提升 prompt cache 命中;tasks 移出核心成为官方扩展。</p>
|
|
814
|
-
</div>
|
|
815
|
-
<div class="tl-item reveal">
|
|
816
|
-
<span class="tl-date">2026-09</span>
|
|
817
|
-
<h4>生态体检:三万条条目,一半自述对不上</h4>
|
|
818
|
-
<p>registry 达 36,134 条;实测 59% 端点可用、47.4% 至少一处自相矛盾。同期安全社区披露“运行时门控的元数据投毒”攻击(Deadbugz),把“工具描述可变”变成供应链问题。</p>
|
|
819
|
-
</div>
|
|
820
|
-
<div class="tl-item reveal">
|
|
821
|
-
<span class="tl-date">2026-10</span>
|
|
822
|
-
<h4>优化下沉到框架:FastMCP 4 内置 Code Mode 与 Tool Search</h4>
|
|
823
|
-
<p>两个能力从“论文/博客”变成服务器框架的标准变换(transform),意味着中小团队不必自研网关也能享受大部分收益。</p>
|
|
824
|
-
</div>
|
|
825
|
-
</div>
|
|
826
|
-
|
|
827
|
-
<h3 style="margin:52px 0 14px">五种范式,与它们各自省下的那一项</h3>
|
|
828
|
-
<div class="tbl-wrap">
|
|
829
|
-
<table>
|
|
830
|
-
<thead>
|
|
831
|
-
<tr><th style="width:15%">范式</th><th style="width:24%">代表实现</th><th style="width:23%">机制</th><th style="width:14%">主要省哪类</th><th>结构性代价</th></tr>
|
|
832
|
-
</thead>
|
|
833
|
-
<tbody>
|
|
834
|
-
<tr><td><b>全量注入</b></td><td>多数 MCP 客户端默认行为</td><td>启动即序列化全部 schema</td><td class="num">—</td><td>定义税随服务器数量线性上涨,无上限</td></tr>
|
|
835
|
-
<tr><td><b>检索式加载</b></td><td>Anthropic Tool Search;FastMCP Tool Search</td><td>元工具 + 关键词/BM25/向量检索,命中后展开 schema</td><td class="num">定义税</td><td>多一次检索与推理;召回率决定上限</td></tr>
|
|
836
|
-
<tr><td><b>网关门控</b></td><td>Tool Attention;Docker MCP Gateway;企业自建 broker</td><td>中间件按意图、权限、状态筛选 top-k 工具</td><td class="num">定义税</td><td>单点故障;多租户权限模型复杂</td></tr>
|
|
837
|
-
<tr><td><b>代码执行</b></td><td>Cloudflare Code Mode;Anthropic PTC;mcp-pyrunner</td><td>工具变函数,编排在沙箱内完成,只回传结果</td><td class="num">定义 + 结果 + 往返</td><td>沙箱安全、可观测性、代码生成错误</td></tr>
|
|
838
|
-
<tr><td><b>输出整形</b></td><td>TOON;分页游标;结果句柄;服务端摘要</td><td>改变编码、粒度与引用方式</td><td class="num">结果税</td><td>格式兼容性;信息损失不可逆</td></tr>
|
|
839
|
-
</tbody>
|
|
840
|
-
</table>
|
|
841
|
-
</div>
|
|
842
|
-
<p class="tbl-note">五种范式可叠加。生产系统通常是“网关门控 + 检索式加载 + 输出整形”,代码执行作为高价值路径的可选加速器。</p>
|
|
843
|
-
|
|
844
|
-
<h3 style="margin:44px 0 14px">协议层已经做了减法,但没有解决经济学</h3>
|
|
845
|
-
<p>2026-07-28 版规范是一次“去状态化”重构。它对工程质量的提升是实打实的,但对 token 账单的直接贡献有限——因为账单的大头在客户端如何装配上下文,而不在线上传了什么。</p>
|
|
846
|
-
|
|
847
|
-
<div class="tbl-wrap">
|
|
848
|
-
<table>
|
|
849
|
-
<thead><tr><th style="width:22%">规范变化</th><th style="width:34%">做了什么</th><th>对成本的真实影响</th></tr></thead>
|
|
850
|
-
<tbody>
|
|
851
|
-
<tr><td><b>无状态化</b></td><td>删除 <code>initialize</code> 握手与 <code>Mcp-Session-Id</code>,版本与能力随每个请求放在 <code>_meta</code></td><td>重试/扩缩容更便宜;对 token 几乎无影响,但降低了“为保会话而保上下文”的诱惑</td></tr>
|
|
852
|
-
<tr><td><b>server/discover</b></td><td>服务器必须实现该 RPC,声明版本、能力与身份</td><td>客户端可在加载前做一次廉价探测,为“先目录、后详情”提供协议依据</td></tr>
|
|
853
|
-
<tr><td><b>可缓存列表</b></td><td><code>tools/list</code> 等结果必须带 <code>ttlMs</code> 与 <code>cacheScope</code></td><td>减少重复拉取与轮询;让“清单缓存”成为标准行为而非客户端私货</td></tr>
|
|
854
|
-
<tr><td><b>稳定排序</b></td><td>服务器应以确定顺序返回工具列表</td><td><strong>直接提升 prompt cache 命中率</strong>,这是最被低估的一条</td></tr>
|
|
855
|
-
<tr><td><b>MRTR</b></td><td>服务端索取输入改为返回 <code>input_required</code>,客户端重试原请求</td><td>减少 server-initiated 请求的复杂状态机,降低失败重试成本</td></tr>
|
|
856
|
-
<tr><td><b>tasks 转扩展</b></td><td>长任务从核心移入 <code>io.modelcontextprotocol/tasks</code>,改为轮询</td><td>避免长阻塞连接;但轮询本身会产生额外请求,需要退避策略</td></tr>
|
|
857
|
-
<tr><td><b>弃用 roots/sampling/logging</b></td><td>三类能力进入弃用窗口</td><td>减少“服务器反向调用模型”的隐性成本与安全面</td></tr>
|
|
858
|
-
</tbody>
|
|
859
|
-
</table>
|
|
860
|
-
</div>
|
|
861
|
-
<p class="tbl-note">来源:MCP Specification 2026-07-28 “Key Changes”(SEP-2567 / 2575 / 2322 / 2549 / 2663 / 2577)。</p>
|
|
862
|
-
|
|
863
|
-
<div class="callout" style="border-left-color:var(--gold)">
|
|
864
|
-
<h4>一个正在分叉的共识</h4>
|
|
865
|
-
<p>协议层 2026 年的工作,优化的是<strong>可缓存性</strong>(稳定排序、ttl、无状态),因为提示词缓存的命中率比“少几百 token”更决定真实账单;而多数厂商与论文仍在优化<strong>token 数量</strong>。两者并不等价:一份更短但每轮都变的目录,可能比一份更长但完全命中的目录更贵。更麻烦的是,唯一一项独立评测发现,纯靠“换编码”压缩会带来准确率损失(见第 05 节 TOON 条目)。<span class="hl">这是本报告认为最值得下注的判断:稳定性 > 压缩率。</span></p>
|
|
866
|
-
</div>
|
|
867
|
-
</section>
|
|
868
|
-
|
|
869
|
-
<!-- ================= 05 GEMS ================= -->
|
|
870
|
-
<section class="sec" id="s5">
|
|
871
|
-
<div class="sec-head">
|
|
872
|
-
<div class="sec-num">05 / SIGNALS</div>
|
|
873
|
-
<h2>八个还没被广泛抄走的亮点<span class="sub">它们未必最出名,但每一个都指向了可复用的设计模式,而不是一次性的技巧。</span></h2>
|
|
874
|
-
</div>
|
|
875
|
-
|
|
876
|
-
<p class="lead">以下按“可复用性”而非热度排序。每张卡片只回答三件事:它做了什么、证据是什么、我们能拿走什么。</p>
|
|
877
|
-
|
|
878
|
-
<div class="grid g2" style="margin-top:32px">
|
|
879
|
-
|
|
880
|
-
<div class="card reveal">
|
|
881
|
-
<span class="idx">01 · SERVER-SIDE TRANSFORM</span>
|
|
882
|
-
<h4>FastMCP 4 的 Code Mode / Tool Search 变换</h4>
|
|
883
|
-
<p>把两种优化做成服务器框架的“变换层”:开启后,服务端自动把工具集折叠成一个代码执行入口,或挂上检索入口。业务代码几乎不改。</p>
|
|
884
|
-
<div class="why"><b>可拿走</b>:优化应该是<strong>可开关的中间层</strong>,而不是重写服务器。这决定了它能否被大范围采用。</div>
|
|
885
|
-
<div class="tag-row"><span class="tag live">已发布 v4.0.5</span><span class="tag">框架层</span></div>
|
|
886
|
-
</div>
|
|
887
|
-
|
|
888
|
-
<div class="card reveal">
|
|
889
|
-
<span class="idx">02 · DEFERRED LOADING</span>
|
|
890
|
-
<h4>Anthropic 的 <code>defer_loading</code> 与 <code>mcp_toolset</code></h4>
|
|
891
|
-
<p>在 API 层给工具打“延迟加载”标记:整个服务器可默认不加载,只把最常用的 1–2 个工具常驻。<code>defer_loading</code> 的工具不进入初始 prompt,因此<strong>不破坏 prompt cache</strong>。</p>
|
|
892
|
-
<div class="why"><b>可拿走</b>:延迟加载的正确姿势是“从初始 prompt 中彻底移除”,而不是“先放进去再让模型忽略”。</div>
|
|
893
|
-
<div class="tag-row"><span class="tag live">生产可用</span><span class="tag hot">72K→8.7K</span></div>
|
|
894
|
-
</div>
|
|
895
|
-
|
|
896
|
-
<div class="card reveal">
|
|
897
|
-
<span class="idx">03 · SANDBOX EXECUTION</span>
|
|
898
|
-
<h4>Cloudflare Code Mode 的 isolate 执行器</h4>
|
|
899
|
-
<p>每个会话一个 Dynamic Worker isolate,模型生成的 TypeScript 在其中运行,通过类型化绑定调用 API。工具描述只剩 <code>search</code> 与 <code>execute</code> 两个。</p>
|
|
900
|
-
<div class="why"><b>可拿走</b>:<strong>“一个执行工具”比“一千个工具”更省</strong>,但前提是沙箱足够便宜、足够隔离、启动足够快。</div>
|
|
901
|
-
<div class="tag-row"><span class="tag">2,594 endpoints</span><span class="tag hot">≈1K tokens</span></div>
|
|
902
|
-
</div>
|
|
903
|
-
|
|
904
|
-
<div class="card reveal">
|
|
905
|
-
<span class="idx">04 · MIDDLEWARE GATING</span>
|
|
906
|
-
<h4>Tool Attention:把“注意力”变成可计算的分数</h4>
|
|
907
|
-
<p>用句向量计算用户意图与工具描述的重叠度(ISO 分数),叠加状态门控(前置条件、权限范围),再做两阶段懒加载:上下文里只留摘要池,top-k 才展开完整 schema。</p>
|
|
908
|
-
<div class="why"><b>可拿走</b>:检索不该只按“语义相似”,还要按<strong>状态可用性</strong>过滤——没登录的工具不该被召回。</div>
|
|
909
|
-
<div class="tag-row"><span class="tag">arXiv 2604.21816</span><span class="tag">模拟 −95%</span></div>
|
|
910
|
-
</div>
|
|
911
|
-
|
|
912
|
-
<div class="card reveal">
|
|
913
|
-
<span class="idx">05 · CATALOG ENCODING</span>
|
|
914
|
-
<h4>TERSE Tool Catalog:给“目录”本身设计编码</h4>
|
|
915
|
-
<p>不是在调用时压缩,而是在<strong>目录层</strong>定义一种更紧凑的工具清单表示:短标识、分层命名、可增量拉取。10 个真实工具定义从 1,948 压到 650 tokens(−66.6%),还额外塞进了 WHEN / ERR / TAGS 三个字段。</p>
|
|
916
|
-
<div class="why"><b>可拿走</b>:大多数方案优化了 schema,却忘了“目录”才是每轮都要出现的东西。目录应是可缓存、可分页、可签名的。</div>
|
|
917
|
-
<div class="tag-row"><span class="tag">扩展规范草案</span><span class="tag">−66.6%</span><span class="tag">+8.3pp 选择准确率</span></div>
|
|
918
|
-
</div>
|
|
919
|
-
|
|
920
|
-
<div class="card reveal">
|
|
921
|
-
<span class="idx">06 · OUTPUT ENCODING</span>
|
|
922
|
-
<h4>TOON:为 token 而不是为解析器设计序列化</h4>
|
|
923
|
-
<p>面向“同构对象数组”的紧凑文本格式,用一次表头 + 行式数据替代重复键名,宣称比 JSON 少三到六成。但 2026 年一项独立评测(4 个 agentic benchmark × 5 个开源模型)只测到 <strong>≤18% 的节省</strong>,且伴随约 9 个百分点的准确率损失,多轮解析还会级联失败。</p>
|
|
924
|
-
<div class="why"><b>可拿走</b>:换输出格式仍是投入产出比最高的一招,但必须用<strong>任务成功率</strong>验收,而不是只看 token 计数。</div>
|
|
925
|
-
<div class="tag-row"><span class="tag hot">约 −40%(厂商)</span><span class="tag">独立评测:−18% / −9pp</span></div>
|
|
926
|
-
</div>
|
|
927
|
-
|
|
928
|
-
<div class="card reveal">
|
|
929
|
-
<span class="idx">07 · REPRESENTATION</span>
|
|
930
|
-
<h4>Playwright MCP:用无障碍树替代截图</h4>
|
|
931
|
-
<p>浏览器自动化不走“截图 + 视觉模型”,而是把页面的 accessibility tree 转成结构化文本。同样的操作,视觉 token 被换成了可定位的节点引用。</p>
|
|
932
|
-
<div class="why"><b>可拿走</b>:省 token 的最高境界是<strong>换表示</strong>,而不是压缩表示。选对模态,成本差一个数量级。</div>
|
|
933
|
-
<div class="tag-row"><span class="tag live">微软维护</span><span class="tag">高采用</span></div>
|
|
934
|
-
</div>
|
|
935
|
-
|
|
936
|
-
<div class="card reveal">
|
|
937
|
-
<span class="idx">08 · ANTI-PROTOCOL</span>
|
|
938
|
-
<h4>gh CLI:零定义成本的“反向 benchmark”</h4>
|
|
939
|
-
<p>编码 Agent 本来就会用 <code>gh</code>、<code>git</code>、<code>curl</code>。给它们一个终端,等于给了数百个“预训练过的工具”,定义成本接近于零,还能用 <code>--help</code> 自解释。</p>
|
|
940
|
-
<div class="why"><b>可拿走</b>:如果一件事已有成熟 CLI,<strong>包一层 MCP 往往是负优化</strong>。新协议必须回答:凭什么比 shell 更好?</div>
|
|
941
|
-
<div class="tag-row"><span class="tag dark">范式挑战</span><span class="tag">零 schema</span></div>
|
|
942
|
-
</div>
|
|
943
|
-
|
|
944
|
-
</div>
|
|
945
|
-
|
|
946
|
-
<div class="grid g3" style="margin-top:34px;border-top:1px solid var(--line-strong);padding-top:26px">
|
|
947
|
-
<div>
|
|
948
|
-
<div class="tag" style="margin-bottom:9px">SEP-2640 · SKILLS</div>
|
|
949
|
-
<h4 style="font-size:14.5px;margin-bottom:6px">把“说明书”也变成按需资源</h4>
|
|
950
|
-
<p class="small" style="margin:0">技能以 <code>skill://</code> 资源暴露,列表只返回 frontmatter 与摘要;规范明确要求宿主“不得在连接、列举或审批时提前抓取技能正文”。这是渐进披露第一次被写进协议文本。</p>
|
|
951
|
-
</div>
|
|
952
|
-
<div>
|
|
953
|
-
<div class="tag" style="margin-bottom:9px">SEP-1865 · MCP APPS</div>
|
|
954
|
-
<h4 style="font-size:14.5px;margin-bottom:6px">UI 也是一种 token 优化</h4>
|
|
955
|
-
<p class="small" style="margin:0">交互结果渲染为应用资源,<strong>仅服务于该应用的内部工具不会进入模型的工具列表</strong>。把“多轮文本往返”换成“一次渲染”,省下的是往返税。</p>
|
|
956
|
-
</div>
|
|
957
|
-
<div>
|
|
958
|
-
<div class="tag" style="margin-bottom:9px">JEVSEARCH · EXPERIMENTAL</div>
|
|
959
|
-
<h4 style="font-size:14.5px;margin-bottom:6px">检索不出来时,允许“没有”</h4>
|
|
960
|
-
<p class="small" style="margin:0">用校准过的 yes/no 概率决定是否返回结果,无匹配时返回空,而不是硬塞一个“最不差”的工具。对漏召回导致的误调用,这是一个反直觉但有效的补丁。</p>
|
|
961
|
-
</div>
|
|
962
|
-
</div>
|
|
963
|
-
|
|
964
|
-
<div class="callout" style="margin-top:36px">
|
|
965
|
-
<h4>把八个作品放在一起看</h4>
|
|
966
|
-
<p>它们没有一个在改 JSON-RPC 的字段。真正的创新集中在三处:<strong>目录与详情的分离</strong>(01/02/05)、<strong>执行位置的下沉</strong>(03/04)、<strong>结果表示的重选</strong>(06/07)。第八个则提醒我们:有时最优解是退出协议。</p>
|
|
967
|
-
</div>
|
|
968
|
-
</section>
|
|
969
|
-
|
|
970
|
-
<!-- ================= 06 SUCCESS ================= -->
|
|
971
|
-
<section class="sec" id="s6">
|
|
972
|
-
<div class="sec-head">
|
|
973
|
-
<div class="sec-num">06 / WHAT WORKS</div>
|
|
974
|
-
<h2>成功样例:它们都不是“工具更多”,而是“面更小”<span class="sub">六个已上线、可验证的案例,以及它们共同的技术选择。</span></h2>
|
|
975
|
-
</div>
|
|
976
|
-
|
|
977
|
-
<p class="lead">一个反直觉的规律:真正被大量使用的 MCP 服务,工具数量通常很少(3–15 个),场景极窄,但在那个场景里做到了“不用看文档也会用”。</p>
|
|
978
|
-
|
|
979
|
-
<div class="grid g2" style="margin-top:32px">
|
|
980
|
-
|
|
981
|
-
<div class="card reveal" style="border-top:2px solid var(--rust)">
|
|
982
|
-
<span class="idx">CASE 01 · CLOUDFLARE</span>
|
|
983
|
-
<h4>把 2,594 个端点折成 3 个入口</h4>
|
|
984
|
-
<p>远程 MCP 服务器托管在边缘,OAuth 复用现有账号体系;Code Mode 只暴露 <code>search</code>、<code>execute</code> 与 <code>docs</code> 三个入口,模型写 TypeScript 调用全部 API。</p>
|
|
985
|
-
<p style="margin-top:10px"><strong>结果</strong>:2,594 个 API 端点,原生逐端点 schema 约 117 万 tokens,折叠后约 1,000 tokens——三个数量级。</p>
|
|
986
|
-
<div class="why"><b>关键选择</b>:不为 Agent 单独造 API,而是给现有 API 生成类型化 SDK,再把 SDK 塞进沙箱。</div>
|
|
987
|
-
</div>
|
|
988
|
-
|
|
989
|
-
<div class="card reveal" style="border-top:2px solid var(--rust)">
|
|
990
|
-
<span class="idx">CASE 02 · ANTHROPIC</span>
|
|
991
|
-
<h4>把“检索”做进模型 API 本身</h4>
|
|
992
|
-
<p>Tool Search 让 <code>defer_loading</code> 的工具完全不进入初始 prompt;PTC 让工具在代码沙箱里被调用。Claude 的 75+ 连接器都建立在 MCP 之上,而这两项能力是让它们规模化可用的关键。Claude Code / Agent SDK 已<strong>默认开启</strong>工具检索:每次最多加载 5 个工具,目录上限 1 万。</p>
|
|
993
|
-
<p style="margin-top:10px"><strong>结果</strong>:定义 72K→8.7K;50 个工具的成本被压到 10–20K tokens;官方称工具数超过 30–50 个后选择准确率开始下降。</p>
|
|
994
|
-
<div class="why"><b>关键选择</b>:优化发生在<strong>客户端/API 层</strong>,服务器完全无感——这是覆盖面最大的杠杆。</div>
|
|
995
|
-
</div>
|
|
996
|
-
|
|
997
|
-
<div class="card reveal" style="border-top:2px solid var(--teal)">
|
|
998
|
-
<span class="idx">CASE 03 · PLAYWRIGHT MCP</span>
|
|
999
|
-
<h4>用无障碍树替代截图</h4>
|
|
1000
|
-
<p>微软维护的浏览器自动化服务器,把页面表示为可定位的 accessibility tree 节点,而不是像素。模型看到的是“按钮 #12,名字=提交”,不是一张 1280×800 的图。仓库 38,466 星。</p>
|
|
1001
|
-
<p style="margin-top:10px"><strong>结果</strong>:成为编码 Agent 的事实标准浏览器工具;同样的操作,token 成本比视觉方案低一个数量级。</p>
|
|
1002
|
-
<div class="why"><b>反讽</b>:其 README 如今明确建议,编码类 Agent 优先用 CLI + Skills,仅在需要<strong>有状态、迭代式</strong>交互时才用 MCP。最成功的 MCP 服务器,自己在劝你少用 MCP。</div>
|
|
1003
|
-
</div>
|
|
1004
|
-
|
|
1005
|
-
<div class="card reveal" style="border-top:2px solid var(--teal)">
|
|
1006
|
-
<span class="idx">CASE 04 · CONTEXT7</span>
|
|
1007
|
-
<h4>把“文档”做成按需检索,而不是塞进 prompt</h4>
|
|
1008
|
-
<p>面向第三方库的文档服务器:先按库名与版本解析,再按问题检索片段,只回传命中的几段,而不是整本 docs。63,423 星。</p>
|
|
1009
|
-
<p style="margin-top:10px"><strong>结果</strong>:被主流编码工具广泛集成,显著降低“API 幻觉”——模型不再编造不存在的函数签名。</p>
|
|
1010
|
-
<div class="why"><b>关键选择</b>:<strong>版本化 + 片段化</strong>。文档类工具的价值在“精确”,不在“全”。</div>
|
|
1011
|
-
</div>
|
|
1012
|
-
|
|
1013
|
-
<div class="card reveal" style="border-top:2px solid var(--gold)">
|
|
1014
|
-
<span class="idx">CASE 05 · LINEAR / FIGMA</span>
|
|
1015
|
-
<h4>把“权限分级”做成产品功能</h4>
|
|
1016
|
-
<p>Linear 的远程服务器跑在 <code>mcp.linear.app/mcp</code>,OAuth 2.1 + 动态客户端注册,<strong>单独提供只读端点与只读 scope</strong>,并支持 Okta 企业级托管授权。Figma 托管 <code>mcp.figma.com/mcp</code>,列出 25+ 客户端,画布写入仍在 beta。</p>
|
|
1017
|
-
<p style="margin-top:10px"><strong>结果</strong>:两者都不是“万能入口”,却都成为各自工作流里的默认选项。</p>
|
|
1018
|
-
<div class="why"><b>关键选择</b>:<strong>工具数量与业务风险成反比</strong>。越涉及权限与生产数据,越要把“只读”“可撤销”做成一等公民。</div>
|
|
1019
|
-
</div>
|
|
1020
|
-
|
|
1021
|
-
<div class="card reveal" style="border-top:2px solid var(--gold)">
|
|
1022
|
-
<span class="idx">CASE 06 · 中国实践</span>
|
|
1023
|
-
<h4>注册中心 + 网关,把存量接口“零改造”接入</h4>
|
|
1024
|
-
<p>Nacos 3.0.1(2025-05-26)首个实现标准 MCP Registry API,并用 MCP-Router 把 stdio/SSE 代理为 Streamable HTTP;3.1 又加了 A2A 注册。Higress 2.1.5(2025-07-03)支持 OpenAPI→MCP、数据库→MCP 自动转换。百炼的“一键 MCP”免去逐服务器配置密钥,每个 Agent 最多挂 5 个服务,密钥由 KMS 托管。</p>
|
|
1025
|
-
<p style="margin-top:10px"><strong>结果</strong>:高德 2025-03 上线 12 项 LBS 能力,ModelScope 2025-04 开出中文 MCP 社区。MCP 在内部更像“服务治理的延伸”,而不是新协议。</p>
|
|
1026
|
-
<div class="why"><b>关键选择</b>:<strong>复用既有治理体系</strong>(注册中心、网关、KMS),而不是另起一套。接入成本低,才有人愿意发布工具。</div>
|
|
1027
|
-
</div>
|
|
1028
|
-
|
|
1029
|
-
</div>
|
|
1030
|
-
|
|
1031
|
-
<div class="callout teal" style="margin-top:36px">
|
|
1032
|
-
<h4>四个共同点</h4>
|
|
1033
|
-
<p><strong>① 小工具面</strong>:3–15 个工具,命名可预测;<strong>② 输出可控</strong>:返回结构化、可裁剪、带游标的结果,而不是整库转储;<strong>③ 托管与鉴权到位</strong>:远程部署 + OAuth/作用域密钥,而不是本地明文 token;<strong>④ 场景窄</strong>:只做一件事,但在那件事上不需要说明书。这四点与“协议是否先进”几乎无关。</p>
|
|
1034
|
-
</div>
|
|
1035
|
-
</section>
|
|
1036
|
-
|
|
1037
|
-
<!-- ================= 07 FAILURE ================= -->
|
|
1038
|
-
<section class="sec" id="s7">
|
|
1039
|
-
<div class="sec-head">
|
|
1040
|
-
<div class="sec-num">07 / WHAT BREAKS</div>
|
|
1041
|
-
<h2>失败样例:六个案例,一个根因<span class="sub">从 55K tokens 的上下文爆炸,到一条 issue 偷走私库——它们坏在不同的地方,坏在同一个前提。</span></h2>
|
|
1042
|
-
</div>
|
|
1043
|
-
|
|
1044
|
-
<div class="grid g2" style="margin-top:32px">
|
|
1045
|
-
|
|
1046
|
-
<div class="card reveal" style="border-left:2px solid var(--rust)">
|
|
1047
|
-
<span class="idx">FAIL 01 · COST</span>
|
|
1048
|
-
<h4>GitHub MCP:93 个工具,55K tokens</h4>
|
|
1049
|
-
<p>2025 年 8 月 23 日,Geoffrey Huntley 估算:在约 176K 可用上下文中,GitHub 一个服务器(93 个工具)占去约 55K,而大多数任务只会用到其中两三个。</p>
|
|
1050
|
-
<p style="margin-top:10px"><strong>根因</strong>:<code>tools/list</code> 的“全有或全无”语义 + 客户端默认全量注入。服务器本身没有错。</p>
|
|
1051
|
-
<div class="why"><b>后续</b>:GitHub 引入 toolsets 分组;2026-08 复测为 85 工具 26.6K、默认 44 工具 14.2K——数字好了一倍,但“一个服务器吃掉 7% 窗口”依然昂贵。Cursor 甚至设了 40 个工具的硬上限,第 41 个工具对模型直接不可见。</div>
|
|
1052
|
-
</div>
|
|
1053
|
-
|
|
1054
|
-
<div class="card reveal" style="border-left:2px solid var(--rust)">
|
|
1055
|
-
<span class="idx">FAIL 02 · SECURITY</span>
|
|
1056
|
-
<h4>一条 issue,偷走私有仓库</h4>
|
|
1057
|
-
<p>2025 年 5 月 26 日,Invariant Labs 演示:攻击者在公开 issue 中埋入指令,Claude 4 Opus 读取后调用 GitHub MCP 读取私有仓库,并开了一个公开 PR,把薪资与搬迁补贴数据泄露出去。</p>
|
|
1058
|
-
<p style="margin-top:10px"><strong>根因</strong>:<strong>致命三要素</strong>同时成立——访问私有数据、处理不可信内容、具备对外发送能力。三者缺一,攻击不成立。</p>
|
|
1059
|
-
<div class="why"><b>教训</b>:工具权限应按“最小可用”切分,出站网络必须白名单。</div>
|
|
1060
|
-
</div>
|
|
1061
|
-
|
|
1062
|
-
<div class="card reveal" style="border-left:2px solid var(--rust)">
|
|
1063
|
-
<span class="idx">FAIL 03 · TENANCY</span>
|
|
1064
|
-
<h4>Asana MCP:跨租户数据泄漏</h4>
|
|
1065
|
-
<p>2025 年 6 月 18 日披露:Asana 的 MCP 服务器 5 月 1 日上线,租户隔离检查发生在缓存之后,导致约 1,000 个组织互相看到项目名、任务与元数据。无需攻击者,正常使用就会触发。</p>
|
|
1066
|
-
<p style="margin-top:10px"><strong>根因</strong>:单一多租户凭据 + 缓存后才校验归属(confused deputy),MCP 层假设“上游 OAuth 已经校验过”。</p>
|
|
1067
|
-
<div class="why"><b>教训</b>:MCP 服务器是独立的安全边界,必须自己做对象级授权,不能继承“调用方应该已经校验过”。</div>
|
|
1068
|
-
</div>
|
|
1069
|
-
|
|
1070
|
-
<div class="card reveal" style="border-left:2px solid var(--rust)">
|
|
1071
|
-
<span class="idx">FAIL 04 · PRIVILEGE</span>
|
|
1072
|
-
<h4>Supabase MCP:一句话拿到 service_role</h4>
|
|
1073
|
-
<p>2025 年 7 月 8 日,General Analysis 演示:支持工单里埋入指令,Cursor 调用 Supabase MCP 查询 <code>integration_tokens</code>,把 OAuth 密钥写回攻击者可见的工单。</p>
|
|
1074
|
-
<p style="margin-top:10px"><strong>根因</strong>:工具默认持有<strong>绕过行级安全的高权限密钥</strong>,且没有只读模式、没有查询白名单。</p>
|
|
1075
|
-
<div class="why"><b>教训</b>:默认只读、按需提权、密钥不落盘——这三条比任何提示词防护都可靠。</div>
|
|
1076
|
-
</div>
|
|
1077
|
-
|
|
1078
|
-
<div class="card reveal" style="border-left:2px solid var(--rust)">
|
|
1079
|
-
<span class="idx">FAIL 05 · SUPPLY CHAIN</span>
|
|
1080
|
-
<h4>Postmark MCP:一个 npm 包,带走所有邮件</h4>
|
|
1081
|
-
<p>2025 年 9 月 25 日:仿冒的 <code>postmark-mcp</code> 包用 15 个正常版本建立信任,第 16 版(1.0.16)开始把每封经手邮件密送(BCC)到外部服务器。</p>
|
|
1082
|
-
<p style="margin-top:10px"><strong>根因</strong>:stdio 型服务器以用户身份运行任意代码,安装即执行;生态缺少签名与沙箱。</p>
|
|
1083
|
-
<div class="why"><b>教训</b>:<code>npx -y</code> 是供应链攻击的完美入口。企业应只允许签名镜像与容器化运行。</div>
|
|
1084
|
-
</div>
|
|
1085
|
-
|
|
1086
|
-
<div class="card reveal" style="border-left:2px solid var(--rust)">
|
|
1087
|
-
<span class="idx">FAIL 06 · MUTABLE TRUST</span>
|
|
1088
|
-
<h4>Deadbugz:描述在运行时被换掉</h4>
|
|
1089
|
-
<p>2026 年 9 月,云安全联盟披露一类“运行时门控的元数据投毒”:工具描述在审批时是良性的,在真正调用时按条件切换为恶意指令,静态扫描与人工审批全部失效。</p>
|
|
1090
|
-
<p style="margin-top:10px"><strong>根因</strong>:<strong>信任对象是可变的</strong>。审批针对的是快照,执行用的是实时值。</p>
|
|
1091
|
-
<div class="why"><b>教训</b>:清单必须签名 + 固定摘要(digest),运行时校验“描述未变”;变更即重新审批。</div>
|
|
1092
|
-
</div>
|
|
1093
|
-
|
|
1094
|
-
</div>
|
|
1095
|
-
|
|
1096
|
-
<div class="callout" style="margin-top:28px">
|
|
1097
|
-
<h4>不是个案,而是结构</h4>
|
|
1098
|
-
<p>一项覆盖 21,643 个服务器、72,606 个版本的 registry 研究发现:<strong>51.1% 的多版本服务器修改过自述元数据,其中 40.6% 是静默修改,4.2% 在保持注册身份不变的情况下把远程端点指向了别处</strong>;另有 9.57% 存在未认证暴露。信任一旦建立在“第一次看到的样子”上,此后每一次热更新都是一次未经审批的部署。</p>
|
|
1099
|
-
</div>
|
|
1100
|
-
|
|
1101
|
-
<h3 style="margin:50px 0 14px">把六个案例抽象一下:五个失败原型</h3>
|
|
1102
|
-
<div class="tbl-wrap">
|
|
1103
|
-
<table>
|
|
1104
|
-
<thead><tr><th style="width:18%">原型</th><th style="width:30%">典型症状</th><th style="width:26%">根因</th><th>对应解法</th></tr></thead>
|
|
1105
|
-
<tbody>
|
|
1106
|
-
<tr><td><b>全量暴露</b></td><td>上下文在对话开始前就被吃满;模型选错工具</td><td>目录与详情未分离,客户端只能全量注入</td><td>检索式加载 + 服务端分层 + 延迟加载</td></tr>
|
|
1107
|
-
<tr><td><b>结果无界</b></td><td>一次调用返回 200KB;第 10 轮还在为重放付费</td><td>工具没有“结果预算”概念,默认原样回传</td><td>分页游标 + 句柄 + 聚合摘要 + 紧凑编码</td></tr>
|
|
1108
|
-
<tr><td><b>信任可变</b></td><td>审批时人畜无害,执行时暗藏指令</td><td>描述与实现可热更新,审批基于快照</td><td>签名清单 + 摘要固定 + 变更重审</td></tr>
|
|
1109
|
-
<tr><td><b>权限过大</b></td><td>一个只读任务却握着管理员密钥</td><td>凭据粒度粗,缺少只读模式与对象级授权</td><td>最小权限 + 按需提权 + 行级/对象级校验</td></tr>
|
|
1110
|
-
<tr><td><b>出站失控</b></td><td>数据被“正常工具调用”带出边界</td><td>没有网络白名单,工具可访问任意域名</td><td>沙箱出站策略 + 数据分级 + 人工确认</td></tr>
|
|
1111
|
-
</tbody>
|
|
1112
|
-
</table>
|
|
1113
|
-
</div>
|
|
1114
|
-
|
|
1115
|
-
<div class="callout dark" style="margin-top:30px">
|
|
1116
|
-
<h4>一个被反复验证的结论</h4>
|
|
1117
|
-
<p style="font-size:16px">安全事件几乎都不是“协议漏洞”,而是<strong style="color:#f0c987">部署方式</strong>的问题:默认开启了不需要的能力、默认授予了不需要的权限、默认信任了不该信任的内容。这和 token 浪费的根因惊人地一致——<span style="color:#fff">都是“默认全给”</span>。</p>
|
|
1118
|
-
</div>
|
|
1119
|
-
</section>
|
|
1120
|
-
|
|
1121
|
-
<!-- ================= 08 FEASIBLE ================= -->
|
|
1122
|
-
<section class="sec" id="s8">
|
|
1123
|
-
<div class="sec-head">
|
|
1124
|
-
<div class="sec-num">08 / OPTIONS</div>
|
|
1125
|
-
<h2>六条可行路线,和它们各自的代价<span class="sub">没有一条是免费的。下面每一项都标注了“省哪类成本”与“把风险搬到了哪里”。</span></h2>
|
|
1126
|
-
</div>
|
|
1127
|
-
|
|
1128
|
-
<p class="lead">把设计空间摊开,能走的路只有六条。五条已在生产环境被验证,第六条(重造协议)在理论上最优,在工程上最差。</p>
|
|
1129
|
-
|
|
1130
|
-
<div class="route">
|
|
1131
|
-
<div class="route-badge">A</div>
|
|
1132
|
-
<div>
|
|
1133
|
-
<div class="route-head"><h3>检索式加载</h3><span class="tag live">生产可用</span><span class="tag">不改服务器</span></div>
|
|
1134
|
-
<p>目录与详情分离:上下文里只放一个轻量检索工具和工具名摘要,模型按需检索,命中的 top-k 才展开完整 schema。Anthropic 用 <code>defer_loading</code> 把延迟加载的工具从初始 prompt 中彻底移除,因此不破坏缓存。</p>
|
|
1135
|
-
<div class="route-grid">
|
|
1136
|
-
<dl class="route-cell"><dt>收益</dt><dd>定义 token <b>−85%</b>(72K→8.7K);准确率反升 25pp。Claude Code 已默认开启,每次最多加载 5 个。</dd></dl>
|
|
1137
|
-
<dl class="route-cell"><dt>代价</dt><dd>多一次检索往返(187 工具实测 <b>0.6–1.1s</b>);召回失败会直接导致任务失败;索引需随工具变更更新。</dd></dl>
|
|
1138
|
-
<dl class="route-cell"><dt>适用</dt><dd>工具数 >10、定义 >10K tokens。几乎零门槛,应作为<strong>默认基线</strong>。</dd></dl>
|
|
1139
|
-
</div>
|
|
1140
|
-
</div>
|
|
1141
|
-
</div>
|
|
1142
|
-
|
|
1143
|
-
<div class="route">
|
|
1144
|
-
<div class="route-badge">B</div>
|
|
1145
|
-
<div>
|
|
1146
|
-
<div class="route-head"><h3>代码模式</h3><span class="tag live">生产可用</span><span class="tag hot">收益最大</span></div>
|
|
1147
|
-
<p>只暴露一个 <code>execute</code> 工具,模型写代码在沙箱里调用类型化绑定。循环、条件、并行、聚合都在沙箱内完成,只有最终结果回到上下文。Cloudflare 用 isolate,Anthropic 用 code execution,FastMCP 把它做成服务器变换。</p>
|
|
1148
|
-
<div class="route-grid">
|
|
1149
|
-
<dl class="route-cell"><dt>收益</dt><dd>定义降到 <b>1K 级</b>;中间结果 200KB→1KB;20 次工具调用省去 19 次推理往返。</dd></dl>
|
|
1150
|
-
<dl class="route-cell"><dt>代价</dt><dd>需要强隔离沙箱与出站管控;代码生成会出错;<strong>可观测性显著变差</strong>(你看到的是代码,不是意图);权限模型要重画。</dd></dl>
|
|
1151
|
-
<dl class="route-cell"><dt>适用</dt><dd>API 面广、数据密集、多步编排。不适合单次简单查询。</dd></dl>
|
|
1152
|
-
</div>
|
|
1153
|
-
</div>
|
|
1154
|
-
</div>
|
|
1155
|
-
|
|
1156
|
-
<div class="route">
|
|
1157
|
-
<div class="route-badge">C</div>
|
|
1158
|
-
<div>
|
|
1159
|
-
<div class="route-head"><h3>网关门控</h3><span class="tag live">企业主流</span><span class="tag">客户端零改动</span></div>
|
|
1160
|
-
<p>在客户端与服务器之间放一个中间件:按用户意图、权限范围、会话状态筛选出 top-k 工具,只把这几份 schema 注入上下文。Tool Attention 进一步引入两阶段加载——常驻摘要池,命中后才取完整 schema。</p>
|
|
1161
|
-
<div class="route-grid">
|
|
1162
|
-
<dl class="route-cell"><dt>收益</dt><dd>每轮 47.3K→2.4K(<b>模拟</b>);GatewayBench 显示分层网关在工具数增长时成本保持平坦,而“全量摊平”的网关线性上涨;顺带统一鉴权、审计、配额。</dd></dl>
|
|
1163
|
-
<dl class="route-cell"><dt>代价</dt><dd>单点故障;多租户权限模型复杂;增加 10–50ms;<strong>召回质量就是系统上限</strong>。</dd></dl>
|
|
1164
|
-
<dl class="route-cell"><dt>适用</dt><dd>企业内数十个服务器、需要统一治理与计费。中国实践多走这条路。</dd></dl>
|
|
1165
|
-
</div>
|
|
1166
|
-
</div>
|
|
1167
|
-
</div>
|
|
1168
|
-
|
|
1169
|
-
<div class="route">
|
|
1170
|
-
<div class="route-badge">D</div>
|
|
1171
|
-
<div>
|
|
1172
|
-
<div class="route-head"><h3>输出整形</h3><span class="tag live">立即可用</span><span class="tag">零协议改动</span></div>
|
|
1173
|
-
<p>不动定义,只动结果:表格型数据换紧凑编码,大结果转句柄按需切片,超长列表分页,聚合在服务端完成再回传。它是唯一可以在一天内上线、且不需要动客户端的方案。</p>
|
|
1174
|
-
<div class="route-grid">
|
|
1175
|
-
<dl class="route-cell"><dt>收益</dt><dd>结果 token <b>−18%(独立评测)~ −40%(厂商口径)</b>;对日志、报表、检索类工具效果最好。</dd></dl>
|
|
1176
|
-
<dl class="route-cell"><dt>代价</dt><dd>独立评测显示紧凑编码带来约 <b>−9pp</b> 准确率损失;解析失败会级联;压缩不可逆。</dd></dl>
|
|
1177
|
-
<dl class="route-cell"><dt>适用</dt><dd>结果体积远大于定义体积的场景。<strong>必须用任务成功率验收</strong>,不能只看 token。</dd></dl>
|
|
1178
|
-
</div>
|
|
1179
|
-
</div>
|
|
1180
|
-
</div>
|
|
1181
|
-
|
|
1182
|
-
<div class="route">
|
|
1183
|
-
<div class="route-badge">E</div>
|
|
1184
|
-
<div>
|
|
1185
|
-
<div class="route-head"><h3>CLI 优先</h3><span class="tag live">被低估</span><span class="tag dark">反协议</span></div>
|
|
1186
|
-
<p>不封装 MCP,直接把能力做成命令行工具。模型对 <code>gh</code>、<code>git</code>、<code>curl</code> 的先验知识就是“免费的工具定义”,<code>--help</code> 则是按需文档。</p>
|
|
1187
|
-
<div class="route-grid">
|
|
1188
|
-
<dl class="route-cell"><dt>收益</dt><dd>定义成本 <b>≈0</b>;固定 git 任务的对照实验中,纯 CLI 方案的综合成本比 MCP 低 <b>5–28 倍</b>,且 MCP 运行中有 12.9% 的花费没有换来任何完成的工作(CLI 为 2.2%);组合与调试体验最好。</dd></dl>
|
|
1189
|
-
<dl class="route-cell"><dt>代价</dt><dd>无结构化错误;shell 权限过大;跨平台与沙箱适配差;非编码场景(设计、支付)不适用。</dd></dl>
|
|
1190
|
-
<dl class="route-cell"><dt>适用</dt><dd>编码 Agent、内部运维工具、已有成熟 CLI 的能力。<strong>MCP 之前先问一句:能不能做成 CLI?</strong></dd></dl>
|
|
1191
|
-
</div>
|
|
1192
|
-
</div>
|
|
1193
|
-
</div>
|
|
1194
|
-
|
|
1195
|
-
<div class="route">
|
|
1196
|
-
<div class="route-badge">F</div>
|
|
1197
|
-
<div>
|
|
1198
|
-
<div class="route-head"><h3>从零设计新协议</h3><span class="tag">理论最优</span><span class="tag hot">不建议</span></div>
|
|
1199
|
-
<p>重新定义 IDL、编码、能力寻址与调用语义,把“按需、预算、可缓存”写进协议本身。技术上完全可行,经济上几乎不可行。</p>
|
|
1200
|
-
<div class="route-grid">
|
|
1201
|
-
<dl class="route-cell"><dt>收益</dt><dd>可以做到理论最优的上下文开销;不受历史包袱约束。</dd></dl>
|
|
1202
|
-
<dl class="route-cell"><dt>代价</dt><dd>生态冷启动;所有客户端与服务器重写;<strong>而 token 瓶颈根本不在 wire format</strong>;还要面对治理与标准化。</dd></dl>
|
|
1203
|
-
<dl class="route-cell"><dt>适用</dt><dd>仅在“客户端与服务器都自研、规模足够大、且需要长期差异化”的封闭生态中考虑。若必须做,只补两个空白:结果预算与句柄引用——<code>discover</code> 与 <code>ttl</code> 已由 2026-07-28 覆盖。</dd></dl>
|
|
1204
|
-
</div>
|
|
1205
|
-
</div>
|
|
1206
|
-
</div>
|
|
1207
|
-
|
|
1208
|
-
<div class="callout teal" style="margin-top:34px">
|
|
1209
|
-
<h4>组合,而不是选择</h4>
|
|
1210
|
-
<p>生产系统的最优解通常是 <strong>A + C + D</strong> 作为基线(检索、门控、整形),<strong>B</strong> 作为高价值路径的加速器,<strong>E</strong> 作为兜底与降级方案。<strong>F</strong> 只在封闭生态里成立。下一节列出八条看似可行、实则走不通的路。</p>
|
|
1211
|
-
</div>
|
|
1212
|
-
</section>
|
|
1213
|
-
|
|
1214
|
-
<!-- ================= 09 ANTI ================= -->
|
|
1215
|
-
<section class="sec" id="s9">
|
|
1216
|
-
<div class="sec-head">
|
|
1217
|
-
<div class="sec-num">09 / DEAD ENDS</div>
|
|
1218
|
-
<h2>八条看起来很美、实则走不通的路<span class="sub">每一条都有人试过,每一条都在某个环节把成本转移而不是消除。</span></h2>
|
|
1219
|
-
</div>
|
|
1220
|
-
|
|
1221
|
-
<p class="lead">判断一条路线是否可行,只需问三个问题:它<strong>消除</strong>了哪一类 token?把风险<strong>转移</strong>到了哪里?转移后的风险是否更贵?</p>
|
|
1222
|
-
|
|
1223
|
-
<div class="anti">
|
|
1224
|
-
<div class="anti-n">01</div>
|
|
1225
|
-
<div>
|
|
1226
|
-
<h4>把上下文窗口扩到 1M,问题就解决了 <span class="tag hot">最常见</span></h4>
|
|
1227
|
-
<p>窗口变大不会让注意力变准。注入的无关工具与历史结果同比增加,信噪比下降;成本按时长线性上涨,长任务的二次成本被放大得更厉害。业界观察到的“70% 利用率后推理质量下滑”,不会因为窗口变大而消失。</p>
|
|
1228
|
-
<div class="ex"><b>例外</b>单次离线分析、无需多轮交互、且结果不需要复用。</div>
|
|
1229
|
-
</div>
|
|
1230
|
-
</div>
|
|
1231
|
-
|
|
1232
|
-
<div class="anti">
|
|
1233
|
-
<div class="anti-n">02</div>
|
|
1234
|
-
<div>
|
|
1235
|
-
<h4>把 schema 缩写成“天书”,用缩写换 token</h4>
|
|
1236
|
-
<p>命名从 <code>create_pull_request</code> 缩成 <code>cpr</code>,能省 20% 不到;但模型正是靠名字与描述区分相似工具。省下的定义 token,会在“选错—重试—澄清”里加倍还回去。</p>
|
|
1237
|
-
<div class="ex"><b>例外</b>工具集极小、且配有高质量示例(Tool Use Examples 曾把参数准确率从 72% 拉到 90%)。</div>
|
|
1238
|
-
</div>
|
|
1239
|
-
</div>
|
|
1240
|
-
|
|
1241
|
-
<div class="anti">
|
|
1242
|
-
<div class="anti-n">03</div>
|
|
1243
|
-
<div>
|
|
1244
|
-
<h4>全量预加载,然后指望 prompt cache 兜底</h4>
|
|
1245
|
-
<p>缓存只在“前缀完全一致”时命中。工具集一变、顺序一抖、租户一换,缓存立刻失效,而你还付着全量定义的窗口占用。多租户 SaaS 场景下,命中率通常远低于预期。</p>
|
|
1246
|
-
<div class="ex"><b>例外</b>单租户、工具集长期稳定、会话短而高频。即便如此,也应配合稳定排序(2026-07-28 已把它写进规范)。</div>
|
|
1247
|
-
</div>
|
|
1248
|
-
</div>
|
|
1249
|
-
|
|
1250
|
-
<div class="anti">
|
|
1251
|
-
<div class="anti-n">04</div>
|
|
1252
|
-
<div>
|
|
1253
|
-
<h4>造一个“万能 MCP”,聚合所有内部 API</h4>
|
|
1254
|
-
<p>定义爆炸没有消失,只是从 N 个服务器转移到了 1 个服务器;还额外获得单点故障、权限混乱、版本耦合。把“聚合”当成“暴露”,是最典型的偷懒。GatewayBench 在 7 个网关、11,118 个工具上测过:全量摊平的网关,token 与时延随工具数线性增长,间接攻击成功率 <strong>60.5%</strong>;分层网关则保持平坦,攻击成功率 <strong>19.6%</strong>。</p>
|
|
1255
|
-
<div class="ex"><b>例外</b>聚合层只做<strong>检索与路由</strong>,不把全部 schema 注入上下文——这正是路线 C 的做法。</div>
|
|
1256
|
-
</div>
|
|
1257
|
-
</div>
|
|
1258
|
-
|
|
1259
|
-
<div class="anti">
|
|
1260
|
-
<div class="anti-n">05</div>
|
|
1261
|
-
<div>
|
|
1262
|
-
<h4>用另一个 LLM 给每次工具结果做摘要</h4>
|
|
1263
|
-
<p>成本与延迟翻倍;摘要在信息损失上不可控;错误会沿着链条传播且难以审计。对高频调用,这是最贵的“省 token”方式。</p>
|
|
1264
|
-
<div class="ex"><b>例外</b>超大文档的<strong>离线</strong>预处理,一次生成、多次复用,且保留原文句柄可回溯。</div>
|
|
1265
|
-
</div>
|
|
1266
|
-
</div>
|
|
1267
|
-
|
|
1268
|
-
<div class="anti">
|
|
1269
|
-
<div class="anti-n">06</div>
|
|
1270
|
-
<div>
|
|
1271
|
-
<h4>换成 Protobuf / CBOR / 二进制传输来省 token</h4>
|
|
1272
|
-
<p>tokenizer 看到的是文本。二进制能省带宽、省解析时间,但省不了提示词里的 token——除非你在客户端把它重新渲染成文本,那就回到了原点。调试成本还显著上升。</p>
|
|
1273
|
-
<div class="ex"><b>例外</b>大文件、流式数据、非提示词路径的传输通道。</div>
|
|
1274
|
-
</div>
|
|
1275
|
-
</div>
|
|
1276
|
-
|
|
1277
|
-
<div class="anti">
|
|
1278
|
-
<div class="anti-n">07</div>
|
|
1279
|
-
<div>
|
|
1280
|
-
<h4>用多 Agent 扇出来规避单个上下文过载</h4>
|
|
1281
|
-
<p>每个子 Agent 都要重新装载工具定义与任务背景,成本线性甚至超线性上升;协调、汇总、冲突消解又引入新的 token 开销。它适合“可并行的独立子任务”,不适合“绕开上下文限制”。</p>
|
|
1282
|
-
<div class="ex"><b>例外</b>子任务彼此独立、可并行、且结果可结构化汇总(如批量审查、多源检索)。</div>
|
|
1283
|
-
</div>
|
|
1284
|
-
</div>
|
|
1285
|
-
|
|
1286
|
-
<div class="anti">
|
|
1287
|
-
<div class="anti-n">08</div>
|
|
1288
|
-
<div>
|
|
1289
|
-
<h4>微调模型,让它“记住”工具;或依赖 server 反向调用模型</h4>
|
|
1290
|
-
<p>工具版本一升级,微调成果立刻过期;供应商锁定严重。至于 sampling(服务器反向请求客户端模型),2026-07-28 规范已将其列入弃用——它把成本与安全边界都推给了不可控的一方。</p>
|
|
1291
|
-
<div class="ex"><b>例外</b>领域 API 极其稳定、且你有能力持续重训的封闭场景。</div>
|
|
1292
|
-
</div>
|
|
1293
|
-
</div>
|
|
1294
|
-
|
|
1295
|
-
<div class="callout dark" style="margin-top:34px">
|
|
1296
|
-
<h4>一条简单的判据</h4>
|
|
1297
|
-
<p style="font-size:16px">任何“省 token”的方案,如果<strong style="color:#f0c987">没有减少进入模型的信息量</strong>,只是把它换了个地方存放,那它迟早会以另一种成本回来——通常是延迟、准确率或安全面。</p>
|
|
1298
|
-
</div>
|
|
1299
|
-
</section>
|
|
1300
|
-
|
|
1301
|
-
<!-- ================= 10 MATRIX ================= -->
|
|
1302
|
-
<section class="sec" id="s10">
|
|
1303
|
-
<div class="sec-head">
|
|
1304
|
-
<div class="sec-num">10 / COMPARISON</div>
|
|
1305
|
-
<h2>横向对比:没有全能选手,只有适配<span class="sub">评分统一为“5 = 最优”,其中“落地成本”一列 5 表示成本最低。</span></h2>
|
|
1306
|
-
</div>
|
|
1307
|
-
|
|
1308
|
-
<div class="tbl-wrap">
|
|
1309
|
-
<table style="min-width:780px">
|
|
1310
|
-
<thead>
|
|
1311
|
-
<tr>
|
|
1312
|
-
<th style="width:20%">路线</th>
|
|
1313
|
-
<th>省 Token</th><th>时延</th><th>准确率</th><th>落地成本</th><th>安全面</th><th>兼容性</th><th style="width:14%">结论</th>
|
|
1314
|
-
</tr>
|
|
1315
|
-
</thead>
|
|
1316
|
-
<tbody>
|
|
1317
|
-
<tr>
|
|
1318
|
-
<td><b>A</b> 检索式加载</td>
|
|
1319
|
-
<td><span class="m"><i style="width:80%"></i></span><b class="mv">4</b></td>
|
|
1320
|
-
<td><span class="m g"><i style="width:60%"></i></span><b class="mv">3</b></td>
|
|
1321
|
-
<td><span class="m"><i style="width:100%"></i></span><b class="mv">5</b></td>
|
|
1322
|
-
<td><span class="m"><i style="width:100%"></i></span><b class="mv">5</b></td>
|
|
1323
|
-
<td><span class="m"><i style="width:80%"></i></span><b class="mv">4</b></td>
|
|
1324
|
-
<td><span class="m"><i style="width:100%"></i></span><b class="mv">5</b></td>
|
|
1325
|
-
<td><span class="tag live">基线首选</span></td>
|
|
1326
|
-
</tr>
|
|
1327
|
-
<tr>
|
|
1328
|
-
<td><b>B</b> 代码模式</td>
|
|
1329
|
-
<td><span class="m"><i style="width:100%"></i></span><b class="mv">5</b></td>
|
|
1330
|
-
<td><span class="m"><i style="width:100%"></i></span><b class="mv">5</b></td>
|
|
1331
|
-
<td><span class="m g"><i style="width:60%"></i></span><b class="mv">3</b></td>
|
|
1332
|
-
<td><span class="m l"><i style="width:40%"></i></span><b class="mv">2</b></td>
|
|
1333
|
-
<td><span class="m l"><i style="width:40%"></i></span><b class="mv">2</b></td>
|
|
1334
|
-
<td><span class="m l"><i style="width:40%"></i></span><b class="mv">2</b></td>
|
|
1335
|
-
<td><span class="tag hot">高价值加速器</span></td>
|
|
1336
|
-
</tr>
|
|
1337
|
-
<tr>
|
|
1338
|
-
<td><b>C</b> 网关门控</td>
|
|
1339
|
-
<td><span class="m"><i style="width:80%"></i></span><b class="mv">4</b></td>
|
|
1340
|
-
<td><span class="m"><i style="width:80%"></i></span><b class="mv">4</b></td>
|
|
1341
|
-
<td><span class="m g"><i style="width:60%"></i></span><b class="mv">3</b></td>
|
|
1342
|
-
<td><span class="m g"><i style="width:60%"></i></span><b class="mv">3</b></td>
|
|
1343
|
-
<td><span class="m g"><i style="width:60%"></i></span><b class="mv">3</b></td>
|
|
1344
|
-
<td><span class="m"><i style="width:100%"></i></span><b class="mv">5</b></td>
|
|
1345
|
-
<td><span class="tag live">企业首选</span></td>
|
|
1346
|
-
</tr>
|
|
1347
|
-
<tr>
|
|
1348
|
-
<td><b>D</b> 输出整形</td>
|
|
1349
|
-
<td><span class="m g"><i style="width:60%"></i></span><b class="mv">3</b></td>
|
|
1350
|
-
<td><span class="m"><i style="width:100%"></i></span><b class="mv">5</b></td>
|
|
1351
|
-
<td><span class="m l"><i style="width:40%"></i></span><b class="mv">2</b></td>
|
|
1352
|
-
<td><span class="m"><i style="width:100%"></i></span><b class="mv">5</b></td>
|
|
1353
|
-
<td><span class="m"><i style="width:100%"></i></span><b class="mv">5</b></td>
|
|
1354
|
-
<td><span class="m"><i style="width:80%"></i></span><b class="mv">4</b></td>
|
|
1355
|
-
<td><span class="tag">低风险补充</span></td>
|
|
1356
|
-
</tr>
|
|
1357
|
-
<tr>
|
|
1358
|
-
<td><b>E</b> CLI 优先</td>
|
|
1359
|
-
<td><span class="m"><i style="width:100%"></i></span><b class="mv">5</b></td>
|
|
1360
|
-
<td><span class="m"><i style="width:80%"></i></span><b class="mv">4</b></td>
|
|
1361
|
-
<td><span class="m"><i style="width:80%"></i></span><b class="mv">4</b></td>
|
|
1362
|
-
<td><span class="m"><i style="width:100%"></i></span><b class="mv">5</b></td>
|
|
1363
|
-
<td><span class="m l"><i style="width:40%"></i></span><b class="mv">2</b></td>
|
|
1364
|
-
<td><span class="m g"><i style="width:60%"></i></span><b class="mv">3</b></td>
|
|
1365
|
-
<td><span class="tag">编码场景兜底</span></td>
|
|
1366
|
-
</tr>
|
|
1367
|
-
<tr>
|
|
1368
|
-
<td><b>F</b> 新协议</td>
|
|
1369
|
-
<td><span class="m"><i style="width:100%"></i></span><b class="mv">5</b></td>
|
|
1370
|
-
<td><span class="m g"><i style="width:60%"></i></span><b class="mv">3</b></td>
|
|
1371
|
-
<td><span class="m g"><i style="width:60%"></i></span><b class="mv">3</b></td>
|
|
1372
|
-
<td><span class="m l"><i style="width:20%"></i></span><b class="mv">1</b></td>
|
|
1373
|
-
<td><span class="m g"><i style="width:60%"></i></span><b class="mv">3</b></td>
|
|
1374
|
-
<td><span class="m l"><i style="width:20%"></i></span><b class="mv">1</b></td>
|
|
1375
|
-
<td><span class="tag hot">不推荐</span></td>
|
|
1376
|
-
</tr>
|
|
1377
|
-
</tbody>
|
|
1378
|
-
</table>
|
|
1379
|
-
</div>
|
|
1380
|
-
<div class="legend">
|
|
1381
|
-
<span>■ 4–5 优</span><span>■ 3 中</span><span>■ 1–2 差</span><span>评分依据:公开基准、案例与工程访谈,非严格量化</span>
|
|
1382
|
-
</div>
|
|
1383
|
-
|
|
1384
|
-
<h3 style="margin:36px 0 14px">三条决策规则</h3>
|
|
1385
|
-
<div class="grid g3">
|
|
1386
|
-
<div class="card reveal">
|
|
1387
|
-
<span class="idx">RULE 01</span>
|
|
1388
|
-
<h4>你控制哪一端?</h4>
|
|
1389
|
-
<p>只控制服务器 → 走 <strong>A + D</strong>(检索由客户端做,你只需让输出可裁剪);只控制客户端 → 走 <strong>A + B</strong>;两端都不控制 → 走 <strong>C</strong>。</p>
|
|
1390
|
-
</div>
|
|
1391
|
-
<div class="card reveal">
|
|
1392
|
-
<span class="idx">RULE 02</span>
|
|
1393
|
-
<h4>任务是编码型还是数据型?</h4>
|
|
1394
|
-
<p>编码型优先 <strong>E</strong>(CLI + Skills),MCP 只保留有状态交互;数据型优先 <strong>B</strong>(代码模式),因为中间结果不该进上下文。</p>
|
|
1395
|
-
</div>
|
|
1396
|
-
<div class="card reveal">
|
|
1397
|
-
<span class="idx">RULE 03</span>
|
|
1398
|
-
<h4>合规压力有多大?</h4>
|
|
1399
|
-
<p>强监管/多租户 → <strong>C</strong> 是唯一能统一审计与配额的形态;弱监管/单团队 → <strong>A + D</strong> 两周即可上线。</p>
|
|
1400
|
-
</div>
|
|
1401
|
-
</div>
|
|
1402
|
-
</section>
|
|
1403
|
-
|
|
1404
|
-
<!-- ================= 11 ARCHITECTURE ================= -->
|
|
1405
|
-
<section class="sec" id="s11">
|
|
1406
|
-
<div class="sec-head">
|
|
1407
|
-
<div class="sec-num">11 / PROPOSAL</div>
|
|
1408
|
-
<h2>如果要做,就做“剖面 + 运行时”,而不是新协议<span class="sub">一个 MCP 兼容的上下文平面:南向不改服务器,北向只给模型四个工具。</span></h2>
|
|
1409
|
-
</div>
|
|
1410
|
-
|
|
1411
|
-
<p class="lead">我们把这个方案叫作 <strong>LCP(Layered Context Profile,分层上下文剖面)</strong>。它不是一套新的线上协议,而是三层约定加一个运行时:剖面规定“模型应该看到什么”,运行时负责“怎么看到”。</p>
|
|
1412
|
-
|
|
1413
|
-
<div class="arch">
|
|
1414
|
-
<div class="arch-kicker">LCP · System Overview</div>
|
|
1415
|
-
|
|
1416
|
-
<div class="layer">
|
|
1417
|
-
<div class="layer-tag">North / Model</div>
|
|
1418
|
-
<div class="layer-body">
|
|
1419
|
-
<span class="chip hi">find_tools(query)</span>
|
|
1420
|
-
<span class="chip hi">inspect_tool(id)</span>
|
|
1421
|
-
<span class="chip hi">run(code, budget)</span>
|
|
1422
|
-
<span class="chip hi">read_handle(id, cursor)</span>
|
|
1423
|
-
<span class="chip dim">固定 ≈300 tokens · 永不随服务器数量增长</span>
|
|
1424
|
-
</div>
|
|
1425
|
-
</div>
|
|
1426
|
-
|
|
1427
|
-
<div class="layer">
|
|
1428
|
-
<div class="layer-tag">Context Plane</div>
|
|
1429
|
-
<div class="layer-body">
|
|
1430
|
-
<span class="chip">Manifest Store<small style="display:block;font-size:9px;color:#8d9198">签名 · TTL · digest</small></span>
|
|
1431
|
-
<span class="chip">Retriever<small style="display:block;font-size:9px;color:#8d9198">BM25 + 向量 + 状态门控</small></span>
|
|
1432
|
-
<span class="chip">Budgeter<small style="display:block;font-size:9px;color:#8d9198">每轮 / 每结果 / 每任务</small></span>
|
|
1433
|
-
<span class="chip">Executor<small style="display:block;font-size:9px;color:#8d9198">隔离沙箱 · 出站白名单</small></span>
|
|
1434
|
-
<span class="chip">Shaper<small style="display:block;font-size:9px;color:#8d9198">TOON / MD / 句柄 / 分页</small></span>
|
|
1435
|
-
<span class="chip">Policy & Audit<small style="display:block;font-size:9px;color:#8d9198">权限 · 审批 · 追踪</small></span>
|
|
1436
|
-
</div>
|
|
1437
|
-
</div>
|
|
1438
|
-
|
|
1439
|
-
<div class="layer">
|
|
1440
|
-
<div class="layer-tag">South / MCP</div>
|
|
1441
|
-
<div class="layer-body">
|
|
1442
|
-
<span class="chip">server/discover</span>
|
|
1443
|
-
<span class="chip">tools/list + ttlMs</span>
|
|
1444
|
-
<span class="chip">tools/call</span>
|
|
1445
|
-
<span class="chip dim">13,087 个现有端点 · 零改造</span>
|
|
1446
|
-
</div>
|
|
1447
|
-
</div>
|
|
1448
|
-
|
|
1449
|
-
<p class="arch-note">关键约束:北向工具数量恒定(4 个),南向服务器数量可无限增长。模型看到的“接口面积”与后端复杂度解耦——这是整个设计的支点。</p>
|
|
1450
|
-
</div>
|
|
1451
|
-
|
|
1452
|
-
<h3 style="margin:44px 0 14px">六个组件,各自只做一件事</h3>
|
|
1453
|
-
<div class="tbl-wrap">
|
|
1454
|
-
<table>
|
|
1455
|
-
<thead><tr><th style="width:17%">组件</th><th style="width:30%">职责</th><th style="width:30%">关键设计</th><th>失效模式</th></tr></thead>
|
|
1456
|
-
<tbody>
|
|
1457
|
-
<tr><td><b>Manifest Store</b></td><td>缓存每个服务器的能力卡片与摘要,替代全量 schema</td><td>签名 + digest + TTL;变更即失效;按需展开详情</td><td>缓存陈旧 → 调用不存在的工具</td></tr>
|
|
1458
|
-
<tr><td><b>Retriever</b></td><td>把用户意图映射到 top-k 工具</td><td>BM25 与向量混合;叠加权限与状态过滤;低置信度返回空</td><td>漏召回 → 任务直接失败</td></tr>
|
|
1459
|
-
<tr><td><b>Budgeter</b></td><td>分配每轮、每结果、每任务的 token 配额</td><td>超限自动转句柄或分页,而不是截断</td><td>配额过紧 → 信息不足</td></tr>
|
|
1460
|
-
<tr><td><b>Executor</b></td><td>在沙箱内执行模型生成的代码,调用类型化绑定</td><td>默认无网络;出站白名单;CPU/内存/时长限额</td><td>沙箱逃逸 / 资源耗尽</td></tr>
|
|
1461
|
-
<tr><td><b>Shaper</b></td><td>把原始结果转换为模型友好的形态</td><td>表格用紧凑编码;大对象转句柄;保留可回溯原文</td><td>压缩过度 → 准确率下降</td></tr>
|
|
1462
|
-
<tr><td><b>Policy & Audit</b></td><td>鉴权、审批、配额、全链路追踪</td><td>每次调用记录 who/what/why;高危操作强制人工确认</td><td>审计缺失 → 无法定责</td></tr>
|
|
1463
|
-
</tbody>
|
|
1464
|
-
</table>
|
|
1465
|
-
</div>
|
|
1466
|
-
|
|
1467
|
-
<h3 style="margin:44px 0 12px">服务侧的五条硬规则</h3>
|
|
1468
|
-
<p style="margin-bottom:6px">协议只能约束“怎么调”,约束不了“长什么样”。如果你在写服务器,这五条比任何协议优化都有效:</p>
|
|
1469
|
-
<ul class="bullets">
|
|
1470
|
-
<li><b>工具 ≤ 15 个</b>:超过就拆服务器,或用 toolsets 分组。工具数量是唯一能被用户直接感知的成本。</li>
|
|
1471
|
-
<li><b>一屏读完</b>:全部工具名 + 一行描述控制在 400 tokens 以内;超出的信息放到 <code>inspect</code> 或文档里。</li>
|
|
1472
|
-
<li><b>描述写“何时用”</b>,而不是“是什么”;相似工具必须写明差异,否则模型一定会选错。</li>
|
|
1473
|
-
<li><b>结果永远可分页</b>:返回游标、给默认 limit、禁止无界列表。一次返回 10 万行是设计缺陷,不是能力。</li>
|
|
1474
|
-
<li><b>默认只读</b>:写操作单独授权;危险操作要求确认、幂等键与可回滚路径。</li>
|
|
1475
|
-
</ul>
|
|
1476
|
-
|
|
1477
|
-
<h3 style="margin:44px 0 10px">三份契约,把“省 token”变成可执行的接口</h3>
|
|
1478
|
-
<p style="margin-bottom:8px">协议的价值不在于定义字段,而在于定义<strong>双方都必须遵守的约束</strong>。LCP 只新增三份契约,全部可作为 MCP 扩展实现。</p>
|
|
1479
|
-
|
|
1480
|
-
<h4 style="margin-top:26px;color:var(--rust);font-family:var(--mono);font-size:10px;letter-spacing:.12em">CONTRACT 01 · MANIFEST(单工具约 35 tokens)</h4>
|
|
1481
|
-
<pre><code>{
|
|
1482
|
-
<span class="s">"id"</span>: <span class="s">"github"</span>, <span class="s">"v"</span>: <span class="s">"2.1.0"</span>, <span class="s">"digest"</span>: <span class="s">"sha256:9f2c…"</span>, <span class="s">"ttl"</span>: 3600,
|
|
1483
|
-
<span class="s">"tags"</span>: [<span class="s">"scm"</span>, <span class="s">"issues"</span>, <span class="s">"ci"</span>],
|
|
1484
|
-
<span class="s">"tools"</span>: [
|
|
1485
|
-
{ <span class="s">"n"</span>: <span class="s">"create_pr"</span>, <span class="s">"sig"</span>: <span class="s">"repo*,head*,base*,title?,body?"</span>, <span class="s">"when"</span>: <span class="s">"需要新建 PR"</span> },
|
|
1486
|
-
{ <span class="s">"n"</span>: <span class="s">"list_issues"</span>, <span class="s">"sig"</span>: <span class="s">"repo*,state?,label?"</span>, <span class="s">"when"</span>: <span class="s">"按状态筛选 issue"</span> }
|
|
1487
|
-
]
|
|
1488
|
-
}</code></pre>
|
|
1489
|
-
<p class="small" style="max-width:52em">对比:GitHub 全量 85 个工具的 schema 约 26,600 tokens(2025 年同口径为 93 个 / 55,000)。清单只保留“名字 + 签名 + 何时用”,完整 schema 在 <code>inspect_tool</code> 时才展开。签名里的 <code>*</code> 表示必填,<code>?</code> 表示可选——一个字符替代一段 JSON Schema。</p>
|
|
1490
|
-
|
|
1491
|
-
<h4 style="margin-top:34px;color:var(--rust);font-family:var(--mono);font-size:10px;letter-spacing:.12em">CONTRACT 02 · BUDGET(每次调用都带配额)</h4>
|
|
1492
|
-
<pre><code>run({
|
|
1493
|
-
code: <span class="s">"..."</span>,
|
|
1494
|
-
budget: {
|
|
1495
|
-
max_result_tokens: 1200, <span class="cm">// 超出即转句柄,不截断</span>
|
|
1496
|
-
format: <span class="s">"toon"</span>, <span class="cm">// toon | md | json</span>
|
|
1497
|
-
on_exceed: <span class="s">"handle"</span>, <span class="cm">// handle | paginate | error</span>
|
|
1498
|
-
deadline_ms: 8000
|
|
1499
|
-
}
|
|
1500
|
-
})</code></pre>
|
|
1501
|
-
<p class="small" style="max-width:52em">“预算”必须由调用方声明、由执行方强制,而不是靠提示词提醒模型“少输出”。这是把软约束变成硬约束的关键一步。</p>
|
|
1502
|
-
|
|
1503
|
-
<h4 style="margin-top:34px;color:var(--rust);font-family:var(--mono);font-size:10px;letter-spacing:.12em">CONTRACT 03 · HANDLE(大结果只回引用)</h4>
|
|
1504
|
-
<pre><code><span class="cm">// 沙箱内:数据留在执行侧</span>
|
|
1505
|
-
<span class="k">const</span> prs = <span class="k">await</span> github.search_prs({ repo, state: <span class="s">"open"</span> });
|
|
1506
|
-
<span class="k">const</span> stale = prs.filter(p => days(p.updatedAt) > 14);
|
|
1507
|
-
<span class="k">return</span> stale.map(p => ({ n: p.number, t: p.title })); <span class="cm">// 仅 20 行回上下文</span>
|
|
1508
|
-
|
|
1509
|
-
<span class="cm">// 需要细节时,按句柄分页取回</span>
|
|
1510
|
-
read_handle(<span class="s">"h_8f2c"</span>, { cursor: 0, limit: 50 })</code></pre>
|
|
1511
|
-
|
|
1512
|
-
<div class="callout teal" style="margin-top:32px">
|
|
1513
|
-
<h4>为什么是“剖面”而不是“协议”</h4>
|
|
1514
|
-
<p><strong>① 南向零改造</strong>:13,087 个可用端点直接复用,不需要说服任何人重写服务器;<strong>② 北向极简</strong>:四个工具长期稳定,prompt 前缀不变,缓存命中率最大化;<strong>③ 可独立迭代</strong>:检索、预算、整形都在代理层,能 A/B、能回滚;<strong>④ 安全收敛</strong>:只要守住沙箱与出站两个边界,风险面远小于“给每个服务器发一把钥匙”。</p>
|
|
1515
|
-
</div>
|
|
1516
|
-
|
|
1517
|
-
<h3 style="margin:44px 0 12px">与 2026-07-28 规范对齐,而不是对抗</h3>
|
|
1518
|
-
<ul class="bullets">
|
|
1519
|
-
<li><b>server/discover</b> 正好是“先目录、后详情”的协议依据:一次探测拿到版本、能力与指令,替代分别拉取三个 list。</li>
|
|
1520
|
-
<li><b>ttlMs / cacheScope</b> 让清单可以合法缓存;<b>稳定排序</b>让北向前缀稳定,直接提升 prompt cache 命中。</li>
|
|
1521
|
-
<li><b>无状态请求</b>让代理层可以水平扩展、随意重试,不必为“保住会话”而保住上下文。</li>
|
|
1522
|
-
<li><b>extensions</b> 字段让 manifest / budget / handle 可以作为官方扩展存在,而不是私货。</li>
|
|
1523
|
-
</ul>
|
|
1524
|
-
</section>
|
|
1525
|
-
|
|
1526
|
-
<!-- ================= 12 ROADMAP ================= -->
|
|
1527
|
-
<section class="sec" id="s12">
|
|
1528
|
-
<div class="sec-head">
|
|
1529
|
-
<div class="sec-num">12 / ROADMAP</div>
|
|
1530
|
-
<h2>落地路线图:先计量,再代理,最后沙箱<span class="sub">总计约 14–22 周。每一步都有可验收的产出,不需要一次性重构。</span></h2>
|
|
1531
|
-
</div>
|
|
1532
|
-
|
|
1533
|
-
<div class="phases">
|
|
1534
|
-
<div class="phase p1 reveal">
|
|
1535
|
-
<div class="p-dur">P0 · 2 周</div>
|
|
1536
|
-
<h4>计量与基线</h4>
|
|
1537
|
-
<p>埋点采集每服务器、每轮、每结果的 token;记录工具选择与重试;建立成本基线。</p>
|
|
1538
|
-
<div class="p-out">产出:一张 token 账单看板</div>
|
|
1539
|
-
</div>
|
|
1540
|
-
<div class="phase p2 reveal">
|
|
1541
|
-
<div class="p-dur">P1 · 4–6 周</div>
|
|
1542
|
-
<h4>代理 MVP</h4>
|
|
1543
|
-
<p>Manifest 缓存 + 混合检索 + 输出整形;对现有客户端透明接入。</p>
|
|
1544
|
-
<div class="p-out">目标:定义 −50%,结果 −30%</div>
|
|
1545
|
-
</div>
|
|
1546
|
-
<div class="phase p3 reveal">
|
|
1547
|
-
<div class="p-dur">P2 · 6–10 周</div>
|
|
1548
|
-
<h4>代码模式</h4>
|
|
1549
|
-
<p>为 top-20 高频工具生成类型化 SDK,接入隔离沙箱与出站白名单。</p>
|
|
1550
|
-
<div class="p-out">目标:结果 −70%,往返 −50%</div>
|
|
1551
|
-
</div>
|
|
1552
|
-
<div class="phase p4 reveal">
|
|
1553
|
-
<div class="p-dur">P3 · 4 周+</div>
|
|
1554
|
-
<h4>协议与治理</h4>
|
|
1555
|
-
<p>把 manifest / budget / handle 提成 MCP 扩展;补签名、审批与审计。</p>
|
|
1556
|
-
<div class="p-out">产出:可对外复用的剖面规范</div>
|
|
1557
|
-
</div>
|
|
1558
|
-
</div>
|
|
1559
|
-
|
|
1560
|
-
<h3 style="margin:40px 0 12px">验收指标(建议直接写进 OKR)</h3>
|
|
1561
|
-
<div class="tbl-wrap">
|
|
1562
|
-
<table>
|
|
1563
|
-
<thead><tr><th style="width:30%">指标</th><th style="width:20%">典型基线</th><th style="width:18%">目标</th><th>测量方式</th></tr></thead>
|
|
1564
|
-
<tbody>
|
|
1565
|
-
<tr><td>每轮工具定义 tokens</td><td class="num">45K–60K</td><td class="num">< 2K</td><td>序列化后的系统提示分段计数</td></tr>
|
|
1566
|
-
<tr><td>单次结果 p95 tokens</td><td class="num">6K–10K</td><td class="num">< 4K</td><td>工具返回体按 tokenizer 计数</td></tr>
|
|
1567
|
-
<tr><td>工具选择准确率</td><td class="num">60%–75%</td><td class="num">> 90%</td><td>人工标注 200 条真实请求</td></tr>
|
|
1568
|
-
<tr><td>单任务成本</td><td class="num">1.0×</td><td class="num">0.4×</td><td>同任务集 A/B,含重试</td></tr>
|
|
1569
|
-
<tr><td>Prompt cache 命中率</td><td class="num">< 40%</td><td class="num">> 80%</td><td>供应商返回的 cached_tokens 占比</td></tr>
|
|
1570
|
-
<tr><td>新工具接入时长</td><td class="num">1–2 天</td><td class="num">< 4 小时</td><td>从注册到首次成功调用</td></tr>
|
|
1571
|
-
</tbody>
|
|
1572
|
-
</table>
|
|
1573
|
-
</div>
|
|
1574
|
-
<p class="tbl-note">基线为多服务器部署的常见区间,需以 P0 实测替换。目标值参考 Anthropic、Cloudflare 公开数据与 FastMCP 实测延迟,属于“可达到但需要工程投入”的水平。</p>
|
|
1575
|
-
</section>
|
|
1576
|
-
|
|
1577
|
-
<!-- ================= 13 RECOMMENDATION ================= -->
|
|
1578
|
-
<section class="sec" id="s13">
|
|
1579
|
-
<div class="sec-head">
|
|
1580
|
-
<div class="sec-num">13 / RECOMMENDATION</div>
|
|
1581
|
-
<h2>八条建议,按可执行性排序<span class="sub">如果只能记住一句话:把“工具”当成接口设计问题,而不是提示词问题。</span></h2>
|
|
1582
|
-
</div>
|
|
1583
|
-
|
|
1584
|
-
<div class="numlist">
|
|
1585
|
-
<li class="reveal">
|
|
1586
|
-
<div><h4>不要造协议,造剖面</h4>
|
|
1587
|
-
<p>MCP 的网络效应已经形成:36,134 条 registry 条目、97M+ 月 SDK 下载、所有主流客户端。新协议的收益上限是“省一点编码”,成本下限是“从零赢一遍生态”。把创新放在运行时与剖面层,收益/成本比高一个数量级。</p></div>
|
|
1588
|
-
</li>
|
|
1589
|
-
<li class="reveal">
|
|
1590
|
-
<div><h4>先量后调,没有基线的优化都是猜测</h4>
|
|
1591
|
-
<p>至少采集四个数:每轮定义 token、每结果 token、工具选择准确率、单任务成本(含重试)。很多团队以为自己在优化定义税,实际最大的开销在结果重放。</p></div>
|
|
1592
|
-
</li>
|
|
1593
|
-
<li class="reveal">
|
|
1594
|
-
<div><h4>先治结果,再治定义</h4>
|
|
1595
|
-
<p>定义税线性、可缓存;结果税二次、会复利。以 55K 定义、20 轮、每轮 10K 结果计,结果累计 2.1M,是定义税的近两倍;单次 50K 时是 9.5 倍。优先级:句柄 > 分页 > 聚合 > 编码压缩。</p></div>
|
|
1596
|
-
</li>
|
|
1597
|
-
<li class="reveal">
|
|
1598
|
-
<div><h4>客户端可控就上代码模式,否则上网关</h4>
|
|
1599
|
-
<p>能改客户端(自研 Agent、内部平台)→ 直接做 <code>execute</code> 沙箱,收益最大;只能改服务器 → 做检索与输出整形;两端都不控 → 在企业边界部署网关。</p></div>
|
|
1600
|
-
</li>
|
|
1601
|
-
<li class="reveal">
|
|
1602
|
-
<div><h4>把“预算”写进接口,而不是写进提示词</h4>
|
|
1603
|
-
<p>“请只返回摘要”是一句请求,不是约束。真正的约束是 <code>max_result_tokens</code> + <code>on_exceed: handle</code>,由执行方强制执行。软约束会被模型忽略,硬约束不会。</p></div>
|
|
1604
|
-
</li>
|
|
1605
|
-
<li class="reveal">
|
|
1606
|
-
<div><h4>稳定性优先于压缩率</h4>
|
|
1607
|
-
<p>一份更短但每轮都变的目录,可能比一份更长但完全命中的目录更贵。保持工具顺序稳定、清单可缓存、前缀不变——这是 2026 年协议层给出的最重要信号。</p></div>
|
|
1608
|
-
</li>
|
|
1609
|
-
<li class="reveal">
|
|
1610
|
-
<div><h4>安全边界画在沙箱与出站,不要画在提示词</h4>
|
|
1611
|
-
<p>提示词注入无法被“更强的系统提示”根治。有效的手段只有三个:最小权限、出站白名单、高危操作人工确认。工具描述还要签名并固定 digest,防止运行时被替换。</p></div>
|
|
1612
|
-
</li>
|
|
1613
|
-
<li class="reveal">
|
|
1614
|
-
<div><h4>向上游提案,不要 fork</h4>
|
|
1615
|
-
<p>manifest / budget / handle 都可以做成 MCP 扩展(<code>extensions</code> 字段已就位)。提交 SEP、开源参考实现、先在内部跑通,比另起炉灶更容易获得长期回报。</p></div>
|
|
1616
|
-
</li>
|
|
1617
|
-
</div>
|
|
1618
|
-
|
|
1619
|
-
<blockquote style="margin-top:52px">
|
|
1620
|
-
MCP 把“连接”变成了商品,于是价值必然上移到“选择与编排”。下一个工具协议的机会,不在插座的形状,而在决定“此刻该让模型看见什么”的那一层。
|
|
1621
|
-
<cite>— 结论</cite>
|
|
1622
|
-
</blockquote>
|
|
1623
|
-
|
|
1624
|
-
<div class="callout" style="margin-top:30px">
|
|
1625
|
-
<h4>如果只做一件事</h4>
|
|
1626
|
-
<p>给你的 Agent 加一个 <strong>“工具预算器”</strong>:每轮声明工具定义上限,每个结果声明 token 上限,超限转句柄。这一个改动通常能在两周内把账单砍掉一半,且不需要改协议、不需要换客户端。</p>
|
|
1627
|
-
</div>
|
|
1628
|
-
</section>
|
|
1629
|
-
|
|
1630
|
-
<!-- ================= 14 REFS ================= -->
|
|
1631
|
-
<section class="sec" id="refs">
|
|
1632
|
-
<div class="sec-head">
|
|
1633
|
-
<div class="sec-num">14 / SOURCES</div>
|
|
1634
|
-
<h2>参考与口径说明<span class="sub">本报告优先引用一手规范与官方工程博客;厂商数据、独立评测与模拟结果分别标注。</span></h2>
|
|
1635
|
-
</div>
|
|
1636
|
-
|
|
1637
|
-
<div class="grid g2" style="gap:26px 40px">
|
|
1638
|
-
<div>
|
|
1639
|
-
<h4 style="font-size:12px;letter-spacing:.08em;font-family:var(--mono);color:var(--faint);margin-bottom:10px">协议与规范</h4>
|
|
1640
|
-
<ul class="bullets tight">
|
|
1641
|
-
<li><a href="https://modelcontextprotocol.io/specification/2026-07-28/changelog">MCP Specification 2026-07-28 · Key Changes</a>(无状态化、server/discover、ttlMs、稳定排序、tasks 扩展)</li>
|
|
1642
|
-
<li><a href="https://modelcontextprotocol.io/specification/2025-11-25/changelog">MCP Specification 2025-11-25 · Key Changes</a>(tasks 实验、URL elicitation、CIMD)</li>
|
|
1643
|
-
<li><a href="https://modelcontextprotocol.io/seps/2640-skills-extension">SEP-2640 · Skills Extension</a>(渐进披露写入规范)</li>
|
|
1644
|
-
<li><a href="https://modelcontextprotocol.io/seps/1865-mcp-apps-interactive-user-interfaces-for-mcp">SEP-1865 · MCP Apps</a>(应用内部工具不进入模型工具列表)</li>
|
|
1645
|
-
<li><a href="https://modelcontextprotocol.io/seps">MCP SEP Index</a>(43 项 Final SEP 中仅 2549/2640 触及上下文成本)</li>
|
|
1646
|
-
</ul>
|
|
1647
|
-
</div>
|
|
1648
|
-
<div>
|
|
1649
|
-
<h4 style="font-size:12px;letter-spacing:.08em;font-family:var(--mono);color:var(--faint);margin-bottom:10px">一线工程</h4>
|
|
1650
|
-
<ul class="bullets tight">
|
|
1651
|
-
<li><a href="https://www.anthropic.com/research/advanced-tool-use">Anthropic · Advanced Tool Use</a>(Tool Search 72K→8.7K,PTC 43,588→27,297)</li>
|
|
1652
|
-
<li><a href="https://www.anthropic.com/research/code-execution-with-mcp">Anthropic · Code Execution with MCP</a>(150K→2K)</li>
|
|
1653
|
-
<li><a href="https://blog.cloudflare.com/code-mode-mcp/">Cloudflare · Code Mode</a>(2,594 端点 → 约 1,000 tokens)</li>
|
|
1654
|
-
<li><a href="https://developers.cloudflare.com/agents/model-context-protocol/cloudflare/servers-for-cloudflare/">Cloudflare · Servers for Cloudflare</a>(search / execute / docs,1.17M→1K)</li>
|
|
1655
|
-
<li><a href="https://code.claude.com/docs/en/agent-sdk/tool-search">Claude Code · Tool Search</a>(默认开启、每次 ≤5 个、目录上限 1 万)</li>
|
|
1656
|
-
<li><a href="https://gofastmcp.com/servers/transforms/tool-search">FastMCP 4 · Tool Search / Code Mode</a>(187 工具检索 0.6–1.1s)</li>
|
|
1657
|
-
</ul>
|
|
1658
|
-
</div>
|
|
1659
|
-
<div>
|
|
1660
|
-
<h4 style="font-size:12px;letter-spacing:.08em;font-family:var(--mono);color:var(--faint);margin-bottom:10px">研究与评测</h4>
|
|
1661
|
-
<ul class="bullets tight">
|
|
1662
|
-
<li><a href="https://arxiv.org/abs/2604.21816">Tool Attention</a>(arXiv 2604.21816,模拟 −95%,端到端为投影)</li>
|
|
1663
|
-
<li><a href="https://arxiv.org/abs/2605.29676">Notation Matters</a>(arXiv 2605.29676,TOON ≤18% 且 −9pp)</li>
|
|
1664
|
-
<li><a href="https://zenodo.org/records/19869008">TERSE Tool Catalog v1.0</a>(1,948→650 tokens,−66.6%)</li>
|
|
1665
|
-
<li><a href="https://councilof.ai/state/2026-09/">State of the Agent Internet · 2026-09</a>(36,134 条目 / 13,087 可用 / 47.4% 不一致)</li>
|
|
1666
|
-
<li><a href="https://survey.stackoverflow.co/2026/ai/data.md">Stack Overflow Developer Survey 2026</a>(n=17,464)</li>
|
|
1667
|
-
</ul>
|
|
1668
|
-
</div>
|
|
1669
|
-
<div>
|
|
1670
|
-
<h4 style="font-size:12px;letter-spacing:.08em;font-family:var(--mono);color:var(--faint);margin-bottom:10px">案例与生态</h4>
|
|
1671
|
-
<ul class="bullets tight">
|
|
1672
|
-
<li><a href="https://simonwillison.net/2025/Aug/22/too-many-mcps/">Simon Willison · Too many MCPs</a>(GitHub MCP 93 工具 / 55K tokens)</li>
|
|
1673
|
-
<li><a href="https://github.com/github/github-mcp-server/issues/844">github-mcp-server #844</a>(私有仓库外泄)</li>
|
|
1674
|
-
<li><a href="https://github.com/microsoft/playwright-mcp">microsoft/playwright-mcp</a>(a11y tree,38,466★)</li>
|
|
1675
|
-
<li><a href="https://github.com/upstash/context7">upstash/context7</a>(63,423★)</li>
|
|
1676
|
-
<li><a href="https://linear.app/docs/mcp">Linear MCP</a>(只读端点 + OAuth 2.1 + Okta)</li>
|
|
1677
|
-
<li><a href="https://nacos.io/blog/release-301/">Nacos 3.0.1</a>(MCP Registry API / MCP-Router)</li>
|
|
1678
|
-
<li><a href="https://higress.cn/blog/higress-gvr7dx_awbbpb_nvygddyr4wff1g5v/">Higress 2.1.5</a>(OpenAPI→MCP、DB→MCP)</li>
|
|
1679
|
-
<li><a href="https://www.anthropic.com/news/donating-the-model-context-protocol-and-establishing-of-the-agentic-ai-foundation">Anthropic · Donating MCP to AAIF</a>(10,000+ 公开服务器、97M+ SDK 下载)</li>
|
|
1680
|
-
</ul>
|
|
1681
|
-
</div>
|
|
1682
|
-
</div>
|
|
1683
|
-
|
|
1684
|
-
<div class="callout" style="margin-top:40px">
|
|
1685
|
-
<h4>口径与局限</h4>
|
|
1686
|
-
<p>① 标注“厂商”的数字来自官方博客或文档,未经独立复现;②“模拟/投影”指论文中的仿真基准,作者已声明非线上实测;③ registry 计数来自第三方测量机构,其方法论公开但存在测量时点差异;④ 本报告未对任何产品做安全测试,失败案例均引自公开披露;⑤ 中国市场信息以公开产品文档与报道为准,未做独立验证。</p>
|
|
1687
|
-
</div>
|
|
1688
|
-
</section>
|
|
1689
|
-
|
|
1690
|
-
<footer>
|
|
1691
|
-
<div>
|
|
1692
|
-
<b>MCP 的 Token 税</b><br>
|
|
1693
|
-
下一代工具协议技术尽调 · 2026 年 10 月
|
|
1694
|
-
</div>
|
|
1695
|
-
<div style="text-align:right">
|
|
1696
|
-
数据截至 2026-10-21<br>
|
|
1697
|
-
40+ 条外部证据 · 15 个章节<br>
|
|
1698
|
-
本报告为独立分析,不构成投资建议
|
|
1699
|
-
</div>
|
|
1700
|
-
</footer>
|
|
1701
|
-
</main>
|
|
1702
|
-
|
|
1703
|
-
<script>
|
|
1704
|
-
(function () {
|
|
1705
|
-
var doc = document.documentElement;
|
|
1706
|
-
doc.classList.remove('no-js');
|
|
1707
|
-
doc.classList.add('js');
|
|
1708
|
-
|
|
1709
|
-
var reveals = Array.prototype.slice.call(document.querySelectorAll('.reveal'));
|
|
1710
|
-
|
|
1711
|
-
function showAll() {
|
|
1712
|
-
reveals.forEach(function (el) { el.classList.add('in'); });
|
|
1713
|
-
}
|
|
1714
|
-
|
|
1715
|
-
if (!('IntersectionObserver' in window)) {
|
|
1716
|
-
showAll();
|
|
1717
|
-
} else {
|
|
1718
|
-
var io = new IntersectionObserver(function (entries) {
|
|
1719
|
-
entries.forEach(function (entry) {
|
|
1720
|
-
if (entry.isIntersecting) {
|
|
1721
|
-
entry.target.classList.add('in');
|
|
1722
|
-
io.unobserve(entry.target);
|
|
1723
|
-
}
|
|
1724
|
-
});
|
|
1725
|
-
}, { rootMargin: '0px 0px -6% 0px', threshold: 0.06 });
|
|
1726
|
-
reveals.forEach(function (el) { io.observe(el); });
|
|
1727
|
-
}
|
|
1728
|
-
|
|
1729
|
-
var bar = document.getElementById('progress');
|
|
1730
|
-
function onScroll() {
|
|
1731
|
-
var h = doc.scrollHeight - window.innerHeight;
|
|
1732
|
-
bar.style.width = (h > 0 ? Math.min(100, (window.scrollY / h) * 100) : 0) + '%';
|
|
1733
|
-
}
|
|
1734
|
-
window.addEventListener('scroll', onScroll, { passive: true });
|
|
1735
|
-
window.addEventListener('resize', onScroll);
|
|
1736
|
-
onScroll();
|
|
1737
|
-
|
|
1738
|
-
var links = Array.prototype.slice.call(document.querySelectorAll('.nav a'));
|
|
1739
|
-
var sections = links.map(function (a) {
|
|
1740
|
-
return document.querySelector(a.getAttribute('href'));
|
|
1741
|
-
}).filter(Boolean);
|
|
1742
|
-
|
|
1743
|
-
if ('IntersectionObserver' in window && sections.length) {
|
|
1744
|
-
var spy = new IntersectionObserver(function (entries) {
|
|
1745
|
-
entries.forEach(function (entry) {
|
|
1746
|
-
if (!entry.isIntersecting) return;
|
|
1747
|
-
var id = '#' + entry.target.id;
|
|
1748
|
-
links.forEach(function (a) {
|
|
1749
|
-
a.classList.toggle('active', a.getAttribute('href') === id);
|
|
1750
|
-
});
|
|
1751
|
-
});
|
|
1752
|
-
}, { rootMargin: '-18% 0px -72% 0px', threshold: 0 });
|
|
1753
|
-
sections.forEach(function (s) { spy.observe(s); });
|
|
1754
|
-
}
|
|
1755
|
-
|
|
1756
|
-
// 键盘可达性:Tab 聚焦目录时保持可见
|
|
1757
|
-
document.addEventListener('keydown', function (e) {
|
|
1758
|
-
if (e.key === 'Escape' && document.activeElement) document.activeElement.blur();
|
|
1759
|
-
});
|
|
1760
|
-
})();
|
|
1761
|
-
</script>
|
|
1762
|
-
</body>
|
|
1763
|
-
</html>
|