{"id":12516,"date":"2026-08-11T16:37:24","date_gmt":"2026-08-11T21:37:24","guid":{"rendered":"https:\/\/www.coginov.com\/compliance-speed-and-traceability-how-coginov-helps-public-organizations-meet-new-invoice-payment-requirements\/"},"modified":"2026-08-11T16:50:20","modified_gmt":"2026-08-11T21:50:20","slug":"the-model-is-the-commodity-hybrid-inference-mcp-and-where-document-ai-value-actually-sits","status":"publish","type":"post","link":"https:\/\/www.coginov.com\/en\/the-model-is-the-commodity-hybrid-inference-mcp-and-where-document-ai-value-actually-sits\/","title":{"rendered":"The model is the commodity: hybrid inference, MCP, and where document AI value actually sits"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"12516\" class=\"elementor elementor-12516 elementor-12515\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-a967114 elementor-section-boxed elementor-section-height-default elementor-section-height-default marketum_parallax_no\" data-id=\"a967114\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c8e1c5e\" data-id=\"c8e1c5e\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2751f28 elementor-widget elementor-widget-marketum_heading\" data-id=\"2751f28\" data-element_type=\"widget\" data-widget_type=\"marketum_heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\n        <div class=\"marketum_heading_widget\">\n                                <h2 class=\"marketum_heading\">\n                        The model is the commodity: hybrid inference, MCP, and where document AI value actually sits                    <\/h2>\n                            <\/div>\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e64f681 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"e64f681\" data-element_type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7c21a37 elementor-widget elementor-widget-text-editor\" data-id=\"7c21a37\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"color: #222628;\"><b>By Alkis Papadopoullos, CEO and CTO of Coginov<\/b><\/span><\/p><div class=\"text-base my-auto mx-auto [--thread-content-margin:var(--thread-content-margin-xs,calc(var(--spacing)*4))] @w-sm\/main:[--thread-content-margin:var(--thread-content-margin-sm,calc(var(--spacing)*6))] @w-lg\/main:[--thread-content-margin:var(--thread-content-margin-lg,calc(var(--spacing)*16))] px-(--thread-content-margin)\"><div class=\"[--thread-content-max-width:40rem] @w-lg\/main:[--thread-content-max-width:48rem] mx-auto max-w-(--thread-content-max-width) flex-1 group\/turn-messages focus-visible:outline-hidden relative flex w-full min-w-0 flex-col agent-turn\" data-conversation-screenshot-content=\"\"><div class=\"flex max-w-full flex-col gap-4 grow\"><div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal outline-none keyboard-focused:focus-ring [.text-message+&amp;]:mt-1\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"7db546e3-3693-43eb-be7d-f65e94c4d7e8\" data-message-model-slug=\"gpt-5-5\"><div class=\"flex w-full flex-col gap-1 empty:hidden\"><div class=\"markdown prose dark:prose-invert wrap-break-word w-full light markdown-new-styling\"><p>If you&#8217;re building document extraction into a product right now, the interesting architectural decision is no longer whether to run inference in the cloud or on-prem. That question was live in 2023. It&#8217;s mostly settled \u2014 you do both, and you route. The interesting decision is what you route on, and where the routing topology forces the rest of your architecture to go.<br \/><br \/>Here&#8217;s the scenario that pushed us to think about this properly. A client pipeline: roughly a million invoices a year, about 80% manuscript, hard data-residency requirement that nothing leaves the building. That last constraint isn&#8217;t a preference \u2014 it&#8217;s contractual, and it&#8217;s the sort of clause you find in Quebec public-sector work, in French banking, in a lot of healthcare. So local inference isn&#8217;t a nice-to-have, it&#8217;s the floor for a subset of the corpus. But you also have documents where the residency constraint is softer, the confidence threshold is high, and a cloud model \u2014 Claude, GPT-4o, o1 \u2014 will give you a materially better F1 on named-entity extraction than the local Llama-2 or Qwen deployment can. Both realities coexist inside the same client, sometimes inside the same document batch.<br \/><br \/>So the router isn&#8217;t choosing between cloud and local as deployment styles. It&#8217;s choosing per document, on two axes at once: what&#8217;s the residency class of this document, and what confidence do I need to hit on the extraction before it can flow downstream without a human touching it. When we built the router for QoreCapture&#8217;s hybrid pipeline, that was the substantive design decision \u2014 the intelligent router balances load between cloud and local models based on complexity, cost and latency, but the harder discriminant is the residency-plus-confidence pair. A low-residency, high-confidence-threshold document routes to the cloud model that gives you 90%+ F1. A high-residency document routes to the local Llama-2 stack, even if the F1 is a couple of points lower, because the alternative isn&#8217;t a better score, it&#8217;s a contractual breach.<br \/><br \/><strong>Two things fall out of this that are non-obvious.<\/strong><br \/><br \/>The first is that the connector layer inherits the routing topology, whether you designed it to or not. If a document was inferenced locally because it can&#8217;t leave the perimeter, then the validation calls that follow the extraction \u2014 checking the supplier name, resolving the PO number, verifying the GL code \u2014 cannot leave the perimeter either. Otherwise you&#8217;ve just extracted a sensitive entity locally and shipped it to a cloud API to validate it, which is worse than having sent the document to the cloud in the first place, because now you&#8217;ve fragmented the exposure and made the audit trail incoherent. So the same routing decision that placed the inference also has to place the resolution calls. In our architecture, the confidence-thresholded validation queue is bound to the residency class of the source document, not to the convenience of the connector.<br \/><br \/>The second thing that falls out \u2014 and this is where MCP gets interesting for extraction specifically, not for the generic assistant use case that most of the writing about MCP focuses on \u2014 is that the highest-value use of MCP in a document pipeline isn&#8217;t agent convenience. It&#8217;s resolution at inference time.<br \/><br \/>Consider what an extracted invoice actually is before validation. It&#8217;s a probabilistic assertion: the model thinks the supplier is a particular mid-market logistics vendor, the PO number is one specific value, the total is one specific amount, the GL code should be one specific account. Every one of those fields carries a confidence, and every one of them is wrong often enough that you can&#8217;t just write to the system of record and hope. The industry answer for the last twenty years has been human validation queues \u2014 send everything below threshold to a person. That works, and QoreCapture uses it, but it scales linearly with document volume, and at a million invoices a year the queue itself becomes the bottleneck.<br \/><br \/>What MCP lets you do \u2014 and this is what we&#8217;ve been building against on the Sage X3 and Sage 100cloud integration work \u2014 is have the extraction step itself call the system of record during inference. Not after. During. The extracted supplier name gets checked against the actual supplier master. The PO number gets checked against open POs. The GL code gets checked against the live chart of accounts. If the extracted supplier name differs from the master only in formatting \u2014 a missing &#8220;Inc.&#8221;, a case difference \u2014 and there&#8217;s no other close match, you have a resolved assertion; the extraction and the ground truth agree, and the human queue never sees this document. If the extracted supplier matches nothing, or matches three things ambiguously, then and only then does it go to human review, and it goes with the ambiguity already flagged. The probabilistic extraction has become a verified assertion, or a specifically-flagged unverified one. Those are very different objects downstream.<br \/><br \/>And here&#8217;s the piece almost nobody writes about because most MCP thinking is one-directional: it has to run both ways. QoreCapture is an MCP client into Sage, into whichever ERP or CRM the client runs \u2014 that&#8217;s the resolution direction I just described. But it also has to be an MCP server, so that a partner&#8217;s own agent, or a client&#8217;s own orchestration layer, can call extraction as a tool and keep its own downstream integrations intact. If we only did the client half, we&#8217;d be forcing every partner to accept our integration topology. If we only did the server half, we&#8217;d be a passive tool waiting for someone smarter to orchestrate us. Doing both is what collapses the integration problem from N\u00d7M \u2014 every extraction vendor times every ERP \u2014 to N+M: each extraction system speaks MCP, each ERP speaks MCP, and the wiring is a matter of configuration rather than bespoke connectors.<br \/><br \/><strong>Now the honest tradeoffs, because none of this is free.<\/strong><br \/><br \/>Resolution at inference time adds latency. Every MCP call to Sage during extraction is a network hop with a real cost budget. We&#8217;ve measured local Llama-2 inference stabilized under two seconds; a naive resolution pattern with three or four MCP round-trips per document can add another two or three on top of that. The mitigation is aggressive caching of the reference data \u2014 supplier master, open PO list, chart of accounts \u2014 with careful invalidation, because a stale supplier master will happily resolve an extraction against a supplier that was deactivated last week. Our caching layer cut redundant API calls by about 35% on the cloud-model side and the same pattern applies to MCP resolution calls, but caching a chart of accounts is not caching a Reddit thread \u2014 the freshness requirements are stricter and the failure mode is silent.<br \/><br \/>The other real tradeoff: MCP as a protocol is young. The spec is moving, the auth story is uneven across implementations, and if you&#8217;re building an MCP server that a partner&#8217;s agent will call, you are effectively publishing an API contract to a protocol whose semantics may shift under you. We&#8217;ve been treating our MCP server surface with the same versioning discipline we&#8217;d apply to any external REST API, which is more work than the &#8220;just expose it as a tool&#8221; framing suggests.<br \/><br \/>The practical takeaway, if you&#8217;re designing document AI right now: stop thinking about the model as the durable asset. In eighteen months the frontier model you&#8217;re using today will be a commodity, and the one after it will be too. The durable asset is the connector topology \u2014 the router that decides where inference happens based on residency and confidence, the resolution layer that turns extractions into verified assertions against live systems of record, and the MCP surface that lets you sit on both ends of the wire so you&#8217;re not the bottleneck in someone else&#8217;s integration. Build those well and the model layer becomes swappable, which is what you want, because it&#8217;s going to be swapped whether you want it or not.<\/p><\/div><\/div><\/div><\/div><\/div><\/div><p><b><u>Visit our new QoreCapture Solutions&#8217; page.<\/u><\/b><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4c40d3a elementor-widget elementor-widget-marketum_blockquote\" data-id=\"4c40d3a\" data-element_type=\"widget\" data-widget_type=\"marketum_blockquote.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\n        <div class=\"marketum_blockquote_widget\">\n            <div class=\"marketum_blockquote marketum_view_type_3\">\n                                        <div class=\"marketum_blockquote_marker_container\">\n                                                <div class=\"marketum_blockquote_marker marketum_blockquote_marker_1\"><\/div>\n                        <div class=\"marketum_blockquote_marker marketum_blockquote_marker_2\"><\/div>\n                                                <\/div>\n                        COGINOV <p>\n\nWe create innovative solutions  <p>\n\nCOGINOV is recognized as a world leader in semantic technologies and information management. We are a Canadian software company offering our customers innovative solutions for managing structured and unstructured information. Our head office is based in Montreal.                      <p class=\"marketum_blockquote_author\"><span><\/span><\/p>\n                                <\/div>\n        <\/div>\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9f06c35 elementor-widget elementor-widget-text-editor\" data-id=\"9f06c35\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span class=\"EOP SCXW95493622 BCX0\" data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">Coginov&#8217;s Qore platform technology enhances the information value chain, transforming unstructured content into highly contextualized, accessible and valuable information. Coginov&#8217;s solutions enable you to capture, analyze, engage, automate and manage your information assets, with unrivalled accuracy and efficiency. <\/span><\/p><p><span class=\"TextRun SCXW238616509 BCX0\" lang=\"FR-CA\" xml:lang=\"FR-CA\" data-contrast=\"none\"><span class=\"NormalTextRun SCXW238616509 BCX0\">Discover our solutions <\/span><a href=\"https:\/\/www.coginov.com\/en\/qoreaudit\/\"><span class=\"NormalTextRun SpellingErrorV2Themed SCXW238616509 BCX0\">QoreAudit<\/span><\/a><span class=\"NormalTextRun SCXW238616509 BCX0\">,\u00a0<\/span><a href=\"https:\/\/www.coginov.com\/en\/qore-ultima-2\/\"><span class=\"NormalTextRun SpellingErrorV2Themed SCXW238616509 BCX0\">QoreUltima<\/span><\/a><span class=\"NormalTextRun SCXW238616509 BCX0\"> and <\/span><a href=\"https:\/\/www.coginov.com\/en\/qoremail\/\"><span class=\"NormalTextRun SpellingErrorV2Themed SCXW238616509 BCX0\">QoreMail<\/span><\/a><\/span><span class=\"EOP SCXW238616509 BCX0\" data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t\n    <div class=\"xs_social_share_widget xs_share_url after_content \t\tmain_content  wslu-style-1 wslu-share-box-shaped wslu-fill-colored wslu-none wslu-share-horizontal wslu-theme-font-no wslu-main_content\">\n\n\t\t\n        <ul>\n\t\t\t        <\/ul>\n    <\/div> \n","protected":false},"excerpt":{"rendered":"<p>By Alkis Papadopoullos, CEO and CTO of Coginov If you&#8217;re building document extraction into a product right now, the interesting architectural decision is no longer whether to run inference in the cloud or on-prem. That question was live in 2023. It&#8217;s mostly settled \u2014 you do both, and you route. The interesting decision is what [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":7556,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"postBodyCss":"","postBodyMargin":[],"postBodyPadding":[],"postBodyBackground":{"backgroundType":"classic","gradient":""},"footnotes":""},"categories":[67],"tags":[],"class_list":["post-12516","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.coginov.com\/en\/wp-json\/wp\/v2\/posts\/12516","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.coginov.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.coginov.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.coginov.com\/en\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.coginov.com\/en\/wp-json\/wp\/v2\/comments?post=12516"}],"version-history":[{"count":4,"href":"https:\/\/www.coginov.com\/en\/wp-json\/wp\/v2\/posts\/12516\/revisions"}],"predecessor-version":[{"id":12529,"href":"https:\/\/www.coginov.com\/en\/wp-json\/wp\/v2\/posts\/12516\/revisions\/12529"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.coginov.com\/en\/wp-json\/wp\/v2\/media\/7556"}],"wp:attachment":[{"href":"https:\/\/www.coginov.com\/en\/wp-json\/wp\/v2\/media?parent=12516"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.coginov.com\/en\/wp-json\/wp\/v2\/categories?post=12516"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.coginov.com\/en\/wp-json\/wp\/v2\/tags?post=12516"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}