UpGrowth: business data for Algeria, Tunisia and Morocco
Server Details
Official business data for Algeria, Tunisia and Morocco: activity codes, legal forms, tax, gazettes.
- Status
- Healthy
- Uptime
- 98.8% over 26 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- UpGrowth-dz/upgrowth-mcp
- GitHub Stars
- 0
TDQS
Scored across 30 tools
Most tools have distinct resource/action targets, but there are several parallel families that can be confused: Algerian CNRC versus ANAE activity lookup, JO full-text versus title search versus issue metadata, and calculator tools versus rate-lookup tools. The descriptions are extremely detailed and usually disambiguate, but the volume of overlapping reference tools still creates misselection risk.
Names are consistently snake_case throughout, with predictable prefixes such as get_, list_, search_, and calculate_. The main deviations are a few noun-only tools like creation_legal_forms and customs_tariff_sections, but these remain readable and predictable.
Thirty tools is heavy, but the server covers three countries and many distinct datasets such as tax, legal forms, social contributions, gazettes, geography, customs, and activities. The count is defensible for the broad scope, though fragmentation into many narrowly separated tools makes the surface bulky.
The surface is unusually comprehensive for a business-reference server, covering calculators, rates, legal forms, social contributions, tax calendars, gazette search, activity codes, customs classification, and postal/geographic data. Some gaps remain, such as customs duty rates not being included and Tunisia/Morocco having fewer datasets than Algeria, but these are documented.
Available Tools
30 toolscalculate_casnosEstimate the CASNOS contributionARead-onlyInspect
Estimate the yearly contribution to CASNOS, the Algerian social security fund of the self-employed, for 2026, with the same formula as the UpGrowth calculator: a rate applied to a base that depends on the tax regime, between a floor and a ceiling indexed on the minimum wage (SNMG). Rule applied for Algeria: article 14 of executive decree 15-289 as rewritten by executive decree 26-257 of 15 July 2026 (JO 2026 no. 53, published 23 July 2026, no entry-into-force clause): rate 15 % (7.5 % social insurance, 7.5 % pension) on a base floored at the yearly SNMG (24,000 DA a month, so 288,000 DA, a minimum contribution of 43,200 DA) and capped at twenty times it (5,760,000 DA, a maximum contribution of 864,000 DA); flat-rate tax regimes take 25 % (production and sale of goods) or 35 % (services) of the previous year's tax turnover (decree 24-49), the actual profit regime takes the ordinary result before tax; the first year is based on the yearly SNMG; the auto-entrepreneur may choose 24,000 DA a year. Before 26-257 the floor was the yearly reference wage of 216,000 DA (decrees 22-121 and 20-240, a minimum contribution of 32,400 DA), and the 2026 contribution, due on 1 January, was payable before 1 July 2026: the texts do not say whether 26-257 applies to a 2026 contribution already due (À VÉRIFIER). Since 26-257, with several activities the contribution of each activity cannot be below the minimum; this tool handles one activity at a time. From the third year of activity a floor equal to the average contribution of the same activity in the same wilaya applies: its orders were not found in the Journal officiel, so it is not estimated. Give the regime and, for most regimes, the amount. Returns the yearly, monthly and quarterly contribution with the figures it was computed from, and its limitations: read data.limitations before quoting the result. It is an estimate from public texts, not tax or legal advice. For Tunisia (country TN) it gives the CNSS contribution of the self-employed workers of the non-agricultural sector: regime INDEPENDANT_NON_AGRICOLE and income_class (1 to 10), the quarterly amount the CNSS prints for that class (rate 14.71 %), the yearly amount (four quarters) and the monthly equivalent, in Tunisian dinars, with the period the scale is valid for and the full scale of ten classes; the revenue is not used. Other Tunisian self-employed schemes (agricultural, fishing, craftsmen) are regimes of the same tool, and the Tunisian flat tax is calculate_ifu. Tunisia needs an API key. Morocco (country MA): regime AUTO_ENTREPRENEUR returns the bracket, the quarterly and yearly AMO contribution (supplementary rights, decree 2-21-928) and the pension contribution at 1.57 times it, with the payment dates; regime TRAVAILLEUR_NON_SALARIE returns, for a category (doctor, notary, driver, farmer...), the forfait income multiple set by its decree with its Bulletin officiel, and the rates (AMO 6.37 percent, pension 10 percent of the forfait income, decrees 2-18-623 and 2-18-625); with minimum_wage_hourly it also gives the forfait income and the contributions in dirhams.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| tier | No | Morocco only (country MA): the tier of the category when it has several (for example general or specialist for a doctor, owner or non_owner for a driver, class_1 to class_9 for a farmer, simplified for a trader under the simplified net result regime). The answer lists the tiers of the category. | |
| year | No | Year of the rates. Only the 2026 rates are published today, so this can be left out. | |
| regime | Yes | Algeria: FORFAITAIRE_ACHAT_VENTE (flat-rate, goods, 25 %), FORFAITAIRE_PRESTATIONS (flat-rate, services, 35 %), BENEFICE_REEL (actual profit), AUTO_ENTREPRENEUR (24,000 DA option) or PREMIERE_ANNEE (first year). Tunisia (country TN): INDEPENDANT_NON_AGRICOLE, INDEPENDANT_AGRICOLE and ARMATEUR_PECHE_30T (ten classes, need income_class); PETIT_AGRICULTEUR, PETIT_ARMATEUR_PECHE and PECHEUR_INDEPENDANT (flat 7.5 % scheme of law 2002-32); ARTISAN (craftsmen of the same law, 7.5 % of 2/3 of the SMIG over 200 hours a month). Morocco (country MA): AUTO_ENTREPRENEUR (decree 2-21-928) or TRAVAILLEUR_NON_SALARIE (the other non-salaried workers: one decree per category, chosen with category). | |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
| revenue | No | Yearly amount in Algerian dinars (DZD). For the flat-rate regimes send the tax turnover (chiffre d'affaires fiscal) of the previous financial year; for BENEFICE_REEL send the ordinary result before tax (résultat ordinaire avant impôt) of the financial year closed and declared the previous year. Needed for those three regimes, ignored for AUTO_ENTREPRENEUR and PREMIERE_ANNEE. Ignored for Tunisia (country TN), whose contribution depends on the income class. For Morocco (country MA, regime AUTO_ENTREPRENEUR) it is required: the yearly amount, in Moroccan dirhams (MAD), of the "droits annuels" that select the bracket of the scale of the tax administration. | |
| category | No | Morocco only (country MA), regime TRAVAILLEUR_NON_SALARIE: the category of non-salaried worker, for example doctor, dentist, pharmacist, notary, architect, veterinarian, land_surveyor, judicial_bailiff, taxi_driver, professional_driver, farmer, trader_artisan_accounting, artisan_unaccounted, traditional_fishing_boat_owner, cpu. Leave it out to list the categories, each with its decree and its Bulletin officiel. | |
| net_profit | No | Morocco only (country MA), category trader_artisan_accounting under the actual net result regime: the annual net profit in dirhams, which picks the tier (up to 100,000 dirhams or above). | |
| week_hours | No | Tunisia only (country TN): the weekly working-time regime whose SMIG of décret 2026-67 the craftsmen's contribution uses when smig_monthly_tnd is left out: 48 (554.736 dinars a month, the default) or 40 (470.251). The CNSS page of the craftsmen uses the 48 hour regime, so leave it at 48. | |
| annual_hours | No | Morocco only (country MA): the normal yearly working time in hours used with minimum_wage_hourly; 2,288 (article 184 of the Labour Code, not read in the decrees) when left out. | |
| income_class | No | Tunisia only (country TN): the income class of the insured person in the CNSS scale of the self-employed, from 1 (the lowest base) to 10. Required with the regime INDEPENDANT_NON_AGRICOLE; the answer lists the ten classes. Ignored for Algeria. | |
| seniority_years | No | Morocco only (country MA): the seniority in years, which picks the tier of the categories whose forfait income depends on it (dentist, veterinarian, land_surveyor, architect). Complete years count. | |
| smig_monthly_tnd | No | Tunisia only (country TN): the monthly guaranteed minimum wage (SMIG) in dinars, for the craftsmen of the law no. 2002-32 (regime ARTISAN of calculate_casnos, activity crafts of calculate_ifu): their contribution is 7.5 % of two thirds of its hourly value (monthly amount divided by 208 hours at 48 hours a week) over 200 hours a month. Leave it out to use the SMIG of décret 2026-67 (554.736 dinars, 48 hour week; see week_hours). | |
| minimum_wage_hourly | No | Morocco only (country MA), regime TRAVAILLEUR_NON_SALARIE: the legal hourly minimum wage of non-agricultural activities in dirhams, which the decrees do not state. With it the answer gives the forfait income in dirhams (multiplier times that wage times the yearly hours) and the AMO and pension contributions on it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint/openWorldHint already set, the description still adds real behavioral context: it discloses that results are estimates from public texts and not advice, flags an unresolved legal question (À VÉRIFIER), warns to read data.limitations before quoting, states that Tunisia requires an API key (key_required), and describes the return shape (yearly/monthly/quarterly with inputs and limitations). It stops short of noting rate limits or error behaviors beyond key_required/country_not_available.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single enormous paragraph that mixes Algeria's full legislative history (decrees 22-121, 20-240, 26-257), Tunisia, and Morocco, with legal citations and figures that do not help an agent select or invoke the tool. Much of the Tunisia/Morocco content duplicates the already-100%-covered schema descriptions, and the front-loading dissolves after the first sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter, three-country, 13-regime tool with no output schema, the description is largely complete: it substitutes for the missing output schema (yearly/monthly/quarterly plus the figures used and limitations) and covers regime selection, auth requirements, and per-country caveats. It is only mildly incomplete in that the name/scope mismatch and the legal-history digressions leave the agent to disentangle DZ/TN/MA behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the parameter descriptions are unusually thorough, so the baseline is 3. The description does add cross-parameter coupling (revenue needed for the three Algerian regimes, ignored for AUTO_ENTREPRENEUR/PREMIERE_ANNEE; income_class required with INDEPENDANT_NON_AGRICOLE), but most of that is already restated in the schema, so it does not materially exceed the structured data.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb and resource (estimate the yearly CASNOS contribution for 2026) and names the sibling it is not (calculate_ifu handles the Tunisian flat tax). However, the name/title promise CASNOS (Algerian only) while the description silently expands scope to Tunisia (CNSS) and Morocco (AMO/pension), so the top-line framing understates what the tool actually does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the description lists which regime fits which country and notes that other Tunisian schemes are 'regimes of the same tool' while the Tunisian flat tax is calculate_ifu. That one explicit alternative-routing is useful, but there is no clear when-to-use/when-not framing, and the 'Give the regime and, for most regimes, the amount' instruction is buried mid-paragraph.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_ifuEstimate the IFU flat taxARead-onlyInspect
Estimate the IFU (Impôt Forfaitaire Unique), the flat tax of Algerian micro-businesses, for 2026, with the same formula as the UpGrowth calculator: a rate on the yearly turnover that depends on the regime (auto-entrepreneur or general) and, for the general regime, on the kind of activity, with a minimum tax. Returns the inputs, the base, the rate, whether the minimum applied and the result, and its limitations: read data.limitations before quoting the result. It is an estimate from public texts, not tax or legal advice. For Algeria it does not test eligibility: the IFU is open only to natural persons, traditional art and craft cooperatives and professional civil partnerships (never a SARL or an EURL), up to 8,000,000 DA of turnover (5,000,000 DA for the auto-entrepreneur status), and CIDTA art. 282 ter excludes nineteen activities (real estate promotion, import and wholesale resale, dealers, clinics and laboratories, classified restaurants and hotels, precious metals, public works and building, alcohol outlets, leaf tobacco, caterers, event halls, large stores, vehicle and equipment rental, travel agencies, advertising and communication agencies, training and teaching, insurance agents and brokers). For Tunisia (country TN, regime ae) it estimates the single contribution of the auto-entrepreneur, a yearly amount that does not depend on the turnover (which is only compared with the ceiling of 75,000 dinars): 200 dinars of income tax in a communal zone or 100 dinars elsewhere (zone), plus the social part of the first bracket of the CNSS scale; activity is required and, for a craft activity of the order of 23 July 2002 (crafts), the social part is 7.5 % of two thirds of the hourly SMIG over 200 hours a month (SMIG of décret 2026-67, or smig_monthly_tnd). Tunisia also serves regime forfait (option, zone, rural) and regime general (net_income: the income tax scale). Tunisia needs an API key. For Morocco (country MA) it computes the tax of the auto-entrepreneur on the turnover collected (regime ae only, activity required: 0.5 % for production and commerce up to 500 000 dirhams, 1 % for services up to 200 000 dirhams), with amounts in dirhams (tax_mad); the contribution professionnelle unique is not covered. Morocco needs an API key.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| zone | No | Tunisia only (country TN), required: communal for a person working in a communal zone, within the limits of the communes before 1 January 2015 (200 dinars of income tax a year), other for any other zone (100 dinars). Ignored for Algeria. | |
| rural | No | Tunisia only (country TN), regime forfait with option optional: true for a person working in the rural zones and the villages, who pays half the amount. | |
| option | No | Tunisia only (country TN), regime forfait: standard for the tariff of article 44 ter (400 dinars in a communal zone, 200 elsewhere, up to 10,000 dinars of turnover, then 3 %) or optional for the optional forfait tax of paragraph 1 (4,000 dinars up to 50,000 of turnover, 5,000 dinars up to 100,000). | standard |
| regime | Yes | ae for the auto-entrepreneur status (ANAE), general for the general IFU regime of the other micro-businesses. Tunisia (country TN): ae (single contribution), forfait (forfait tax of article 44 ter of the income tax code, with option and zone) or general (the income tax scale of article 44 applied to net_income). | |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
| activity | No | Kind of activity: production (goods), commerce (resale in the same state) or services (including liberal professions). Required with the general regime, where it sets the rate; ignored with ae. Tunisia (country TN): required, and crafts means a craft or artisanal activity of the order of 23 July 2002, whose social part is two thirds of the SMIG at 7.5 % (week_hours, smig_monthly_tnd). For Morocco (country MA) it is required with ae: production and commerce are taxed at 0.5 %, services at 1 %. | |
| turnover | Yes | Yearly turnover (chiffre d'affaires) in Algerian dinars (DZD), or in Moroccan dirhams (MAD) for country MA. | |
| net_income | No | Tunisia only (country TN), required with regime general: the net taxable income in Tunisian dinars, after the deductions of the code. The scale of article 44 of the income tax code is applied to it; the turnover only serves the minimum tax. | |
| week_hours | No | Tunisia only (country TN): the weekly working-time regime whose SMIG of décret 2026-67 the craftsmen's contribution uses when smig_monthly_tnd is left out: 48 (554.736 dinars a month, the default) or 40 (470.251). The CNSS page of the craftsmen uses the 48 hour regime, so leave it at 48. | |
| smig_monthly_tnd | No | Tunisia only (country TN): the monthly guaranteed minimum wage (SMIG) in dinars, for the craftsmen of the law no. 2002-32 (regime ARTISAN of calculate_casnos, activity crafts of calculate_ifu): their contribution is 7.5 % of two thirds of its hourly value (monthly amount divided by 208 hours at 48 hours a week) over 200 hours a month. Leave it out to use the SMIG of décret 2026-67 (554.736 dinars, 48 hour week; see week_hours). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/openWorldHint annotations: it discloses the return shape (inputs, base, rate, minimum-applied flag, result, limitations), instructs the agent to read data.limitations before quoting, flags 'estimate not tax advice', and explains key_required/country_not_available behavior per country.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded, which is good, but the body is a single dense paragraph interleaving Algeria, Tunisia and Morocco rules, with clauses that duplicate the schema's parameter descriptions. It is information-rich but poorly structured and longer than an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter, no-output-schema tool spanning three countries and multiple regimes, the description supplies the output fields, the limitations caveat, country availability, auth requirements and currency behavior. An agent has everything needed to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter's meaning, enums and defaults. The description adds some cross-cutting context (currency-by-country, activity required/ignored per regime) but largely restates what the schema carries, so the baseline 3 stands.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Estimate) and resource (the IFU flat tax of Algerian micro-businesses) up front, and extends the scope explicitly to Tunisia and Morocco. It is clearly distinguishable from siblings such as calculate_casnos, which it names, and calculate_ifu's regimes make its role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives country- and regime-specific conditions for use (regime ae/general/forfait, activity required, zone required, API key needed for TN/MA) and warns that Algeria eligibility is not tested. It does not explicitly route the agent to a sibling for eligibility checks, so it falls just short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
creation_legal_formsList company legal forms and State feesARead-onlyInspect
List the main legal forms to create a company in Algeria: SARL, EURL, SPA, SPAS and SPASU (the simplified joint-stock company of loi 22-09, reserved to companies certified start-up), SNC, sole trader and auto-entrepreneur. Other forms of the commercial code (sociétés en commandite, groupement, société en participation) are not in this list, so never say a form does not exist because it is missing here: check search_jo_text. For each form it gives the number of partners allowed, the minimum capital and the official State fees of each creation step (trade register, legal announcements and so on) for 2026, with the total of the published fees. A step whose price no official text fixes, such as the notary or the bank, is flagged as not priced instead of guessed. It lists State fees only, never the fees of a service provider, so it is not a quote for a creation. For Tunisia (country TN) it lists the legal forms of the commercial companies code (SARL, SUARL, SA, SNC, SCS) and the sole trader, with the partners allowed, the minimum capital, the liability and the registration steps at the National Register of Enterprises, each with its official fee in Tunisian dinars, its documents and its delay. For Morocco (country MA) it lists the SARL, the single-member SARL (SARL AU), the SA, the SAS, the SNC and the SCS, the sole trader and the auto-entrepreneur status, with the partners allowed, the minimum capital, the liability and the creation steps (negative certificate of OMPIC, statutes, registration of the deeds, professional tax and tax identification, trade register, CNSS affiliation, publication in the official gazette), each with its official fee in Moroccan dirhams when an official page states one. Tunisia and Morocco need an API key.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover only readOnlyHint and openWorldHint, yet the description adds substantial behavioral context beyond them: fees are State fees only and not a quote, unpriced steps are flagged rather than guessed, and Tunisia/Morocco require an API key. This is exactly the kind of disclosure an agent needs to avoid misrepresenting results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, but the body is very long and enumerates every form and every registration step for three countries, which is more inventory than an agent needs to select and call the tool. The State-fees-only constraint is restated, adding redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully carries the burden of explaining what is returned: per-country form lists, partners, capital, and per-step official fees with currency. It also covers multi-country scoping and API-key prerequisites, leaving no material gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for both parameters, so the schema already documents lang and country semantics, including the country_not_available and key_required outcomes. The description reinforces the country behavior but adds no format or syntax detail beyond the schema, matching the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (lists legal forms to create a company) and enumerates the exact content returned: partners allowed, minimum capital, and official State fees per creation step. It also differentiates itself from the sibling search_jo_text by naming the boundary of its own coverage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear routing guidance: 'never say a form does not exist because it is missing here: check search_jo_text,' and explains that only DZ answers without an API key while TN/MA return key_required. It lacks an explicit 'use this when you need X vs Y' framing beyond the one alternative and the auth precondition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
customs_tariff_chaptersList the chapters of a customs tariff sectionARead-onlyInspect
List the chapters (two-digit codes) of one section of the Algerian customs tariff with their titles, for example the chapters of section XVI. Use it after customs_tariff_sections. The same for the Tunisian tariff with country TN (French titles; needs an API key) and for Morocco with country MA (harmonized system 2022, French titles; needs an API key). This dataset holds no duty rates and no tariff lines below the chapter level.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
| section | Yes | Section of the customs tariff in capital Roman numerals, for example XVI. Find the sections with customs_tariff_sections. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: the DZ-default / TN-MA-key-required auth behavior and the failure modes (country_not_available, key_required). It does not, however, describe pagination or result-size behavior. Given annotations carry the safety burden, the added auth/error detail lands this at a solid but not exceptional level.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with what the tool returns and who consumes it next. The country variants are packed densely but each clause is functional; no filler or tautology.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the return burden and does so reasonably: chapters with two-digit codes plus titles, in a chosen language. It also states dataset limits, which prevents wrong expectations. Pagination/ordering behavior is the only notable gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so lang, country, and section are all documented in the schema, including the enum, defaults, and per-country error behavior. The description restates the section format ('two-digit codes') and the section example but adds little syntax or format detail not already present. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (chapters of a customs tariff section) with the exact granularity ('two-digit codes ... with their titles'). It also implicitly separates itself from customs_tariff_sections, which it names as the prerequisite sibling, so an agent can tell the two apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use it after customs_tariff_sections', giving ordering and prerequisite. It also gives negative scope ('holds no duty rates and no tariff lines below the chapter level') and per-country conditions (TN/MA need an API key), which tells the agent when this tool is and is not the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
customs_tariff_sectionsList customs tariff sectionsARead-onlyInspect
List the sections of the Algerian customs tariff, the first level of the harmonized system classification of goods, each with its Roman numeral, its title and the range of its chapters. For Algeria the tariff is not printed in the Journal officiel (ordonnance 01-02 has it published apart by the finance ministry): meta.sources cites the acts behind it and meta.status_note marks the titles À VÉRIFIER. Use it to locate a family of products before listing the chapters of a section. For Tunisia (country TN) it lists the sections of the Tunisian customs tariff, with the titles in French read on the site of the General Directorate of Customs (douane.gov.tn); Tunisia needs an API key. For Morocco (country MA) it lists the 21 sections of the harmonized system 2022 in French (the ADII tariff adopts it; MA needs an API key). This dataset holds no duty rates and no tariff lines below the chapter level.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnlyHint and openWorldHint, but the description discloses substantial behavioral detail: meta.sources attribution, meta.status_note marking titles as 'À VÉRIFIER', API key requirements (TN/MA need keys, only DZ answers otherwise), and the country_not_available/key_required error outcomes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and returned fields, then per-country behavior and limitations. Some redundancy with the schema's country parameter description on API keys and error codes, but each sentence generally earns its place and no filler is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description explains the returned fields and the boundaries of the dataset (no duty rates, no tariff lines below chapter level), plus attribution and verification metadata. An agent has enough to call and interpret the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents lang and country fully, including defaults, enum values, ISO code format, and error behavior. The description largely restates the same country/key semantics rather than adding new meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List the sections of the Algerian customs tariff, the first level of the harmonized system classification of goods') and enumerates the returned fields (Roman numeral, title, chapter range). This clearly distinguishes it from the sibling customs_tariff_chapters tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes: 'Use it to locate a family of products before listing the chapters of a section,' naming the downstream alternative. Adds when-not guidance ('This dataset holds no duty rates and no tariff lines below the chapter level') and per-country conditions for TN/MA versus DZ.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_activity_codeGet a CNRC activity codeARead-onlyInspect
Get one activity of the Algerian CNRC nomenclature by its six-digit code, for example 101101: its status (free, regulated or blocked), its labels in French, Arabic and English, its sector and group, the URL of its page on upgrowth.dz and, in French, the text of the code as the CNRC publishes it: the supervising authority, the type of authorization, what the activity covers, its accessory activities and its legal references. Where UpGrowth compared the text with the Journal officiel and found an abrogated or mistyped reference, a wrong authority or type, or a doubt, details.jo_check gives the corrected value (already put in the field), the value it replaced, the act, the Journal officiel issue and the article, or what is left to verify: read it before quoting the authority or the text of a code. Use it when the user already gives a code, or after search_activity_codes. Returns an error when the code does not exist. For Tunisia (country TN) pass the four-digit NAT 2009 class code, for example 0111: you get its label in French, its section, division and group, its status (reglementee with the authorisations of annex 1 of décret 2018-417 that govern it and their legal references, or libre because that list is exclusive) and the official source. Pass A1-017 or A2-005 to get one authorisation of the decree as a record. For Morocco (country MA) pass the four-digit NMA 2010 code, for example 0111: you get its labels, section, branch, sub-branch and its status not_determined.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Activity code. Algeria: the CNRC code, six digits, for example 101101. Tunisia (country TN): the NAT 2009 class code, four digits, for example 0111 or 01.11, or the code of an authorisation of décret 2018-417, A1-017 (annex 1) or A2-005 (annex 2), or one added by décret 2022-317 such as A1-019bis. Morocco (country MA): the NMA 2010 activity code, four digits, for example 0111. Find codes with search_activity_codes. | |
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint/openWorldHint; the description adds real behavior: it errors when the code does not exist, it returns country_not_available for unsupported datasets, and it requires an API key for TN/MA (key_required). It also flags that details.jo_check must be read before quoting an authority or legal text — substantive operational guidance not derivable from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded, but the description is a single dense block that mixes return-field enumeration, jo_check caveats, and three countries' parameter rules. Much of the return-value detail is useful, yet the lack of any structural separation makes it hard to scan for a fairly simple lookup.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the return-value burden and discharges it fully: status, trilingual labels, sector/group, URL, published French text, plus the jo_check correction fields. Error and auth conditions are also covered, so an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the parameter docs already spell out the per-country code formats, the lang enum and the country default/error behavior. The prose largely restates this, so it adds little beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get one activity of the Algerian CNRC nomenclature by its six-digit code') and then enumerates exactly what the record contains. It is clearly distinguished from search_activity_codes, which is named as the upstream sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'Use it when the user already gives a code, or after search_activity_codes.' It also gives per-country invocation rules (TN four-digit NAT 2009 or A1-/A2- authorisation codes; MA four-digit NMA 2010 code), so the agent knows which form to pass in each case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_anae_activityGet an ANAE activityARead-onlyInspect
Get one activity of the Algerian ANAE nomenclature (auto-entrepreneur status) by its six-digit code, for example 010101: its labels in French, Arabic and English and its domain. Use it when the user gives a code, or after search_anae_activities. Returns an error when the code does not exist. In Algeria an activity that has a regime of its own carries the optional object regime, present only then and today only for 080101, micro-importation: note (the facts in French, Arabic and English: who may import, at most 1,800,000 DZD of goods per trip and two trips a month, the card and the general authorisation of the Ministry of Foreign Trade, the conditions, the advantages, the obligations, the exclusions), legal_reference (executive decree n° 25-170 of 28 June 2025, JO n° 40 of 2025, and the finance law for 2026, law no. 25-17, JO n° 88 of 2025, art. 143, which sets the 5 % customs duty, the exemptions and the flat single tax of 0.5 % per import) and source_url (the Journal Officiel PDF of the decree). That activity is NOT governed by the ordinary auto-entrepreneur limits (finance law 2026, art. 143: micro-importers are eligible notwithstanding the legislation in force, and no text read sets a yearly ceiling of its own for them): never present the 5 million DZD yearly turnover ceiling of the ordinary status as its limit, and read regime.note before answering about it. For Tunisia (country TN) pass the key regime: you get who qualifies (Tunisian nationality, individual practice, the sectors, the ceiling of 75,000 dinars of yearly turnover), the exclusions, the duration, the registration, the single contribution with what it replaces and what it is made of, the late payment fine and the deregistration, each with the article of the law it comes from. The official list of activities is not loaded: say so, and never present the absence of an activity as an exclusion. For Morocco (country MA) pass the key of an excluded profession (for example avocats) to get it with the regime, or the key regime to get the regime alone: the definition, the turnover ceilings (500 000 and 200 000 dirhams), the tax rates (0.5 % and 1 %), the obligations and the legal texts (law 114-13 and its decrees).
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ANAE activity code, six digits, for example 010101. For Morocco (country MA) it is the key of an excluded profession, for example avocats, or regime. Find codes with search_anae_activities. For Tunisia (country TN) it is the key of the regime record: regime (statut and ae are accepted too); Tunisia has no activity codes. | |
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly annotation, it discloses error behavior for non-existent codes, country availability rules (only live countries answer; without an API key only DZ answers), and key_required/country_not_available outcomes. It also warns against misapplying the ordinary 5 million DZD ceiling to micro-importation and directs the reader to regime.note, adding substantial behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, but the remainder is a very dense, parenthetical block mixing Algerian, Tunisian, and Moroccan rules. While most details are potentially useful, the description is far longer than needed and would benefit from tighter grouping and shorter sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and three parameters, the description does the heavy lifting by describing what is returned (labels, domain, optional regime object), error cases, country-specific behavior, and legal caveats. It is complete enough for an agent to invoke and interpret the tool correctly across all supported countries.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the structured parameter descriptions already carry the detailed semantics for code, lang, and country. The description mostly repeats the schema's code examples and adds no parameter-level detail beyond what is already there, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states the exact verb and resource: get one ANAE activity by six-digit code, returning labels in French, Arabic, and English. It clearly distinguishes this from search_anae_activities and explains its broader country-specific uses for TN and MA, so an agent can identify the tool without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use it when the user gives a code or after search_anae_activities, and gives precise conditions for Tunisia (pass the key regime) and Morocco (pass a profession key or regime). It also warns about cases where the official list is not loaded and about not treating absence as exclusion, covering when-not-to-use implications.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_communeGet a commune with its post offices and ATMsARead-onlyInspect
Get one commune of Algeria by its four-digit code (from list_communes) with everything Algérie Poste publishes about it: its names, wilaya and 2026 wilaya, its postal codes, and every post office (name in French and Arabic, class, address, postal code and former postal code, GPS position) and ATM (name, whether it works, postal code, GPS position). Data read from Algérie Poste every day. Algeria only.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The four-digit commune code, for example 1601 (Alger Centre). | |
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint and openWorldHint already declaring the safety profile, the description adds genuine non-obvious context: the data is refreshed from Algérie Poste daily, it covers Algeria only, and it discloses geospatial and address fields returned. It doesn't cover rate limits or auth, but the freshness and scope notes are real added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence that leads with the core action and then unpacks the return payload; the parenthetical field lists are long but each item earns its place by pre-empting a schema lookup. Slightly dense, but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the full burden of describing return values, and it does so exhaustively (post office names in French and Arabic, class, address, postal codes, GPS; ATM name, status, postal code, GPS). Combined with the schema's error-code documentation, an agent has what it needs to call and interpret the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both optional parameters (lang, country) and the code are fully documented in the schema, including enum values and the country_not_available/key_required behaviors. The description adds the 'four-digit, from list_communes' framing for the code but does not extend the optional parameters, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get'), resource ('one commune of Algeria'), and lookup key ('by its four-digit code'), then enumerates exactly what is returned (names, wilaya, postal codes, post offices, ATMs). This clearly separates it from siblings list_communes and get_wilaya.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(from list_communes)' tells the agent where the required code comes from, and 'Algeria only' plus the notes about TN/MA availability set scope. It gives clear usage context but no explicit when-not guidance or alternative tool routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_jo_actGet the full text of a Journal Officiel actARead-onlyInspect
Get the full text of one act of the Algerian Journal Officiel published since 1962, by its number (for example 22-299, with type when a law and a decree share the number) or by year, issue and ord as search_jo_text returns them. Returns its type, number, title, first page, the links to the issue page and the official PDF, the text itself in parts of 20,000 characters (part, parts, chars: ask the next part to read on), and named_in_titles: the earlier or later acts whose title names this one, such as the decrees amending or completing it, its corrigenda and its implementing texts (the newest 50, listed oldest first, with named_in_titles_total and named_in_titles_truncated; each carries a relation, amends, completes, repeals, applies, approves, corrects or cites, read from its title alone, with relations counting them, repealed_by listing the acts whose title says they repeal this one and last_amended_by the newest listed act whose title amends or completes it (or null), never a statement that the act is in force or repealed). Also returns amends: the acts that this act's title says it modifies, completes or repeals, with their place in the Journal officiel when held (null fields when not), and status_hint: repealed_by_later_act, amended or null, read from the titles only. Check named_in_titles before quoting an article: the text is the one published in that issue, not a consolidated version. For 1962 to 2001 (source scan) the text was read from the scan: a passage between [[? and ?]] is not settled yet (uncertain counts them), check it on pdf_url before quoting it; the page is the page of the scan. Without an API key, only the acts of the current year and the two before it. Algeria only (country DZ); other countries return country_not_available.
| Name | Required | Description | Default |
|---|---|---|---|
| ord | No | The place of the act in its issue, as search_jo_text returns it. | |
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| part | No | Which part of the text, 1 by default; parts says how many there are. | |
| type | No | The kind of act, needed when several acts carry the number (a law and a decree, for example). | |
| year | No | The year of the issue (with issue and ord), or to narrow a number. | |
| issue | No | The number of the issue within its year, as search_jo_text returns it. | |
| number | No | The number of the act as the Journal Officiel prints it, for example 22-299 or 26-06. | |
| article | No | One article of the act, for example 25, 1er, 87 bis or 715 bis 133: returns only that article (article, article_text) instead of the parts. It is the article as printed in that issue, not consolidated: named_in_titles still lists the acts that amended it. For 1962 to 2001 scans the [[? ... ?]] marks stay as they are. not_found when the heading is not recognised: read the parts then. | |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnly/openWorld=false; the description adds the auth tier (no key = current year plus two), the country gating, the 20,000-character part chunking with part/parts/chars continuation, the 50-item truncation on named_in_titles with a truncated flag, null semantics for missing fields, and the [[? ... ?]] scan-uncertainty convention. It also explicitly warns that status_hint is read from titles alone and is never a statement of whether the act is in force or repealed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded correctly, but the body is one dense run-on paragraph with deeply nested parentheticals that enumerate return fields. With no output schema the information is necessary, yet the packing makes it hard to scan and the output-field inventory competes with the calling instructions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter, zero-required, output-schema-less tool, the description covers the return shape (type, number, title, page, links, text parts, named_in_titles, amends, status_hint), error cases, pagination, and access tiers. An agent has everything needed to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3; the description earns above that by explaining the part-chaining loop ('ask the next part to read on') and the number-plus-type disambiguation as a coherent lookup recipe rather than a field list. Much of the rest restates what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('get the full text of one act of the Algerian Journal Officiel'), plus scope ('published since 1962') and jurisdiction ('Algeria only'). It also distinguishes itself from the retrieval path by naming the sibling that supplies the identifiers ('as search_jo_text returns them').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear preconditions: obtain identifiers via search_jo_text, supply type when a law and decree share a number, and check named_in_titles before quoting since the text is not consolidated. It also states the no-API-key restriction and the country_not_available outcome. What it never does is contrast itself with the closest unmentioned alternative, get_jo_issue, for issue-level reading.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_jo_issueGet a Journal Officiel issueARead-onlyInspect
Get one issue of the Algerian Journal Officiel by year and number: the links to its official editions and, when UpGrowth holds it, its summary (sommaire): the date and, section by section, the official titles of the texts published in the issue. The summary exists only for some years and issues; otherwise data.sommaire is null and data.note says why. For 1962 to 2001 the summary is read from the scanned issue: data.sommaire.source says so, data.sommaire.titles_held_back counts the entries the readings did not agree on (not listed) and data.sommaire.complete is true when none is missing. For Morocco (country MA) pass the number of the Bulletin officiel, a continuous series (for example 7522): you get its publication date, the links to its French and Arabic editions and, in data.supplements, the supplements of that number (bis, ter); data.sommaire is always null, no Moroccan summary is held yet. For Tunisia (country TN) pass the number of the issue within the year (for example 97): you get its publication date and whether its French and Arabic editions exist, with no direct PDF link; data.sommaire is always null. Use it to find which texts an issue published. Without an API key only Algeria answers, for the current year and the two before it (older years return key_required).
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| year | Yes | Year of the gazette: the Journal Officiel from 1962 for Algeria, the Bulletin officiel from 1912 for Morocco (country MA), the Journal Officiel de la République Tunisienne from 1956 for Tunisia (country TN). Find the years covered with list_jo_years. Without an API key only Algeria answers, for the current year and the two before it; older years come with a paid plan. | |
| number | Yes | Number of the issue. Algeria: its number within the year, starting at 1. Morocco: the number of the Bulletin officiel, a continuous series, for example 7522. Tunisia: its number within the year, for example 97. Find the numbers with list_jo_issues. | |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say the call is read-only and closed-world; the description adds real behavioral detail: data.sommaire may be null with a reason in data.note, pre-2002 summaries come from scanned issues (source, titles_held_back, complete), Morocco returns supplements with no summary, Tunisia gives no PDF link, and older Algerian years return key_required without a key. That is exactly the non-obvious failure and payload context an caller needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and every block is informative, but the passage is long for a 4-parameter tool and repeats content already in the schema (the continuous Morocco series example 7522, the within-year Tunisia example 97, and the free-tier restriction on year). The country paragraphs also repeat 'data.sommaire is always null' twice, which could collapse into one clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the full return-shape burden, and it does: links, sommaire structure, note, source, titles_held_back, complete, supplements, and null-summary cases per country. Combined with existing annotations, an agent has everything needed to call it and interpret the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the enum count is 1, so the schema already explains lang, year, number and country, including the same Morocco/Tunisia number conventions. The description largely restates those conventions rather than adding new semantics, so the baseline of 3 applies despite the added examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get one issue of the Algerian Journal Officiel by year and number') and immediately enumerates what it returns: edition links plus the summary of published texts. It is clearly separable from list_jo_issues (which finds numbers) and get_jo_act/search_jo_text (which look at texts).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use it to find which texts an issue published' gives the operative context, and the description points at list_jo_years and list_jo_issues for the parameters, plus the free-tier rule (only Algeria, current year and two before). It stops short of an explicit 'use search_jo_text instead when you only know a keyword' exclusion, so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_social_contributionsGet the social contributions of a countryARead-onlyInspect
Get the social contributions and payroll levies in a country in 2026, each with its base, its legal source and the official page it was read on. Algeria (DZ, the default country): the CNAS social security contribution on salaries (34.5 %: 25 % employer, 9 % employee and 0.5 % social works fund, with its split by branch; unemployment insurance and early retirement are branches inside that rate, not separate contributions), five special categories of workers (home workers, people employed by private individuals, artists and authors, parking attendants, fishing crews), and the CASNOS contribution of the self-employed with its rate, its base, its floor and ceiling (rule of executive decree 26-257, published 23 July 2026) and the auto-entrepreneur flat option. The Algerian list is not complete: the other categories of decree 85-34, journalists paid by the task, professional sports clubs and the CACOBATPH are not in it (see the note of cnas_general_regime), so never say a contribution does not exist because it is missing here: search the Journal officiel. Tunisia (TN): the social security (CNSS) contribution with its employer and employee shares, the work accident range, the complementary pension regime and the payroll levies (vocational training tax TFP and housing fund contribution FOPROLOS). Morocco (MA): the CNSS contributions (family allowances, short-term and long-term social benefits with their salary ceiling), the compulsory health insurance (AMO) and the vocational training tax (TFP), with the employer and employee shares. For an Algerian estimate use calculate_casnos and calculate_ifu. Tunisia and Morocco need an API key.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint and openWorldHint, so the description carries the real behavioral load and does so: it discloses the API-key gate for TN/MA, that the Algerian list is incomplete and which categories are excluded, and that missing entries must not be read as non-existence. That auth constraint plus data-coverage caveat is exactly the beyond-annotations context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the closing sentences carry the routing and auth guidance, but the middle is a dense per-country enumeration whose internal rate detail (34.5 % split, decree references) reads more like output documentation than definition. Effective but bloated for a two-parameter lookup tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-jurisdiction reference tool with no output schema, the description is complete: it summarizes the shape of the answer, names supported countries, flags the incompleteness of the Algerian dataset, and points to the estimate tools. An agent has everything needed to call it correctly and interpret gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters (lang, country) are fully documented in the schema with defaults, enum and the country_not_available/key_required behavior. The description reinforces the DZ default and names the supported countries, but adds little the schema does not already state, so baseline 3 is right.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the social contributions and payroll levies in a country in 2026') and enumerates exactly what is returned per jurisdiction (base, legal source, official page read on). An agent can distinguish this revenue/levy reference tool from calculate_casnos or get_tax_rates without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes usage: 'For an Algerian estimate use calculate_casnos and calculate_ifu' names the alternatives and the condition, and it states 'Tunisia and Morocco need an API key'. It also warns when not to conclude absence ('never say a contribution does not exist because it is missing here: search the Journal officiel'), which is unusually actionable routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_support_schemesGet the support schemes, labels and investment rules of AlgeriaARead-onlyInspect
Get the business support schemes and investment rules of Algeria as the Journal officiel sets them, each item with who it applies to, its amount when the text gives one, its article and the official Journal officiel issue: investment law 22-18 and its 2022 decrees (the investment regimes and their advantages and durations, the zones of particular interest, the structuring investments, the guarantees including the transfer of capital and income, the non-eligible activities, and the processing fees of the Algerian investment promotion agency AAPI: 60,000 DA for the registration certificate of a project under 2 billion DA, 400,000 DA for a larger or a foreign one, decree 22-299 art. 23), the start-up, innovative project, incubator and scale-up labels (decree 20-254 as amended in 2021 and 2025) and the tax advantages of the start-up and incubator labels (finance law 2026 arts 100 and 101: 4 years plus 2 on renewal for a start-up, 2 years renewable for an incubator; decree 21-170 as amended in 2023 for the list of equipment), the NESDA scheme (conditions of article 2: project holders aged 18 to 55 with a diploma, a qualification or recognised know-how, own funds and no earlier aid; self-financed micro-enterprise; rent loan up to 500,000 DA) and the CNAC transitional articles abrogated with its statute (decree 26-258; the pending files and the scheme of decree 03-514 marked À VÉRIFIER). The investment law still names the professional activity tax, which the 2024 finance law abolished; its article 79 replaces such references, as the case may be, by the local solidarity tax, so the IBS exemption applies and the TAP part is marked À VÉRIFIER. The micro-credit (ANGEM) amounts and the NESDA and CNAC financing levels are left out on purpose (they were amended several times and the whole chain of texts is not read): do not quote figures for them. A point the published text leaves open is marked TO VERIFY (À VÉRIFIER) in the item. Filters: q (words, accents ignored, e.g. redevance, transfert, label) and treatment (investment_regime, investment_zone, investment_guarantee, investment_fees, non_eligible, label, startup_tax, nesda, cnac). Algeria only (country DZ); other countries return country_not_available.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Words that must all appear in the item (label, who, amount, legal basis), accents and case ignored, for example redevance, transfert, label, NESDA. | |
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
| treatment | No | Only the items of this kind. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and closed-world, and the description layers substantial extra context on top: explicit error codes (country_not_available, key_required without an API key), data-quality flags (À VÉRIFIER / TO VERIFY on open points), and a clear statement of what is deliberately omitted and must not be quoted. That is well beyond what the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the opening sentence runs roughly 300 words and packs exhaustive legal citation (article numbers, decree dates, fee amounts, tax articles) that belongs in the returned data, not the tool selector. The density actively harms scannability, so this is over-specification rather than conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and four optional parameters, the description carries the full burden of saying what comes back, how items are annotated, which categories exist, and what happens on out-of-scope input or missing credentials. Nothing an agent needs in order to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both enums are documented in the schema, so the description's restatement of q examples ('redevance, transfert, label') and the full treatment enum list is largely redundant. It adds no syntax, format or interaction detail beyond what the structured fields already provide, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ('Get the business support schemes and investment rules of Algeria as the Journal officiel sets them') and enumerates the exact domain it covers (law 22-18 and decrees, labels, NESDA, CNAC), which no sibling such as search_jo_text or get_jo_act duplicates. An agent can tell what this returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives operative guidance for querying (q and treatment filters, with examples) and dictates how to treat results ('do not quote figures' for micro-credit, NESDA and CNAC financing; country DZ only, others return country_not_available). However, it never names an alternative tool or the condition that should route the agent elsewhere.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tax_calendarGet the tax and social filing calendar of AlgeriaARead-onlyInspect
Get the legal filing and payment deadlines of businesses in Algeria, each with who must file, the deadline as the text words it, its article and the official text it was read in (the 2026 tax codes of the Directorate General of Taxes, checked on 20 October 2026 against the finance laws of the Journal officiel, and the CNAS and CASNOS sites): the monthly VAT return and payment (G50, within the first 20 days of each month, CTCA art. 76-1, and every quarter under the simplified regime, art. 78 bis), the withholding tax on salaries, pensions and annuities (by the 20th, monthly or quarterly, CIDTA art. 129-1), the IBS advance payments (20 March, 20 June and 20 November, art. 356) and the IRG advance payments (art. 355), the IFU forecast return G12 and the IFU minimum (by 30 June), the IFU payment in full or in instalments (50 %, then 1-15 September and 1-15 December), the IFU final return G12 bis (by 20 January of the next year), the IFU option for the real regime (before 1 February) and the IFU late filing increases (10 %, 20 %, 25 %), the declaration of existence (within 30 days of the start of the activity), the annual profit return (by 30 April), the annual summary statement ERA (before 30 September), the annual IRG return (by 30 June), the special return of the IRG result (by 30 April), the transfer pricing return (by 30 April), the vocational training and apprenticeship taxes (every half year, by the 20th of the following month), the penalty for an annual return not filed (25 %, reduced to 10 % or 20 % when filed within two months, 35 % after a formal notice), the CNAS contributions (within 30 days of each quarter or month), the CNAS annual declaration DAS (within 30 days of the year end) and affiliation (within 10 days of hiring), and the CASNOS base declaration (by 1 March) and annual contribution (before 1 July, before 1 October for people carrying on an agricultural activity only). A deadline on a legal holiday moves to the next working day. The list is not exhaustive: other taxes and returns of the codes are not included, and the extensions of deadlines decided by the DGI (law 23-15, art. 14) are not listed. Filters: q (words, accents ignored, e.g. "IFU" or "CNAS") and treatment (monthly, quarterly, semiannual, annual, advance, ifu, social, penalty, general). Algeria only (country DZ); other countries return country_not_available.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Words that must all appear in the item (label, who, deadline, legal basis), accents and case ignored, for example G50, IFU, CNAS, 30 avril. | |
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
| treatment | No | Only the obligations of this kind. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/openWorldHint annotations, the description discloses data provenance (2026 DGT codes, checked 20 October 2026), a behavioral rule (holidays shift deadlines to the next working day), completeness limits (not exhaustive; extensions absent), and error semantics (country_not_available, key_required without an API key). This is unusually rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is front-loaded and useful, but the body is a ~300-word enumeration of every individual obligation, article number and penalty percentage. That content belongs in the tool's returned data, not in a description whose job is selection and invocation; it buries the operational guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing the return shape, and it does: each item includes who must file, the deadline text, its article and the official source. Combined with filter semantics and error behavior, an agent has enough to call and interpret the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all four parameters are already documented. The description adds a couple of q examples ('IFU', 'CNAS') but mostly restates the treatment enum verbatim, so it does not meaningfully extend the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line names a specific verb and resource ('Get the legal filing and payment deadlines of businesses in Algeria') and immediately enumerates the categories it covers, so an agent can distinguish it from siblings like get_tax_rates or get_tax_code_article without reading the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context: filter by q and treatment, Algeria only, with an explicit pointer to list_countries for other datasets. It also warns the list is not exhaustive and that DGI extensions are excluded. What's missing is explicit routing against the closest siblings (e.g., when to use get_tax_code_article instead for full article text).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tax_code_articleGet an article of the tax codes of AlgeriaARead-onlyInspect
Get one article of one of the six tax codes of Algeria in full, from the 2026 editions of the Direction générale des impôts: cidta, cpf, ctca, ce, cii or ct (search_tax_code says what each holds), by the number the code prints: 150, 282 quater, 300-3, 2 bis (Art., accents and case are ignored). Returns the code and its title, the edition, the link to the official PDF, the article id, its heading (part, title, chapter, section), its status (in_force, or abrogated: such an article holds only the word Abrogé), its text in French with the paragraphs on separate lines, its notes (the finance laws that created, amended or repealed it, as the code lists them) and the ids of the previous and the next article, and a citation line (code title, art., edition, link) to paste as the source. The text is the DGI's consolidated edition and the legal reference stays the Journal officiel: use get_jo_act to read a finance law that a note names. An unknown article is a not_found error that lists the nearest article numbers. Use it to read an article before quoting it, and name it by code and number (for example CTCA art. 21). Algeria only (country DZ); other countries return country_not_available.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The code: cidta (direct taxes and similar taxes), cpf (tax procedures), ctca (turnover taxes, VAT), ce (registration), cii (indirect taxes) or ct (stamp duty). | |
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| article | Yes | The article number as the code prints it, for example 150, 282 quater, 300-3 or 2 bis (Art., accents and case are ignored). | |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, so the description carries the rest and does so richly: the full response shape (title, edition, PDF link, id, heading, status, text with line-broken paragraphs, notes, prev/next ids, citation line), the fact that abrogated articles contain only the word 'Abrogé', and the not_found error that lists nearest article numbers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and name are front-loaded in the first clause, and the long return-field enumeration is justified because no output schema exists. It is a single dense run-on paragraph, however, and the field list could be tightened without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With four parameters, no output schema and no destructive behavior, the description still covers return values, error semantics, language/country constraints, sibling routing and the authoritative-source caveat (DGI edition vs Journal officiel). Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds the article-number syntax tolerance ('Art., accents and case are ignored') with concrete examples (150, 282 quater, 300-3, 2 bis). It slightly conflicts with the schema on country handling — the description says other countries return country_not_available while the schema says TN/MA return key_required — which costs a point but does not obscure the practical constraint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Get one article of one of the six tax codes of Algeria in full', and enumerates the exact code set (cidta, cpf, ctca, ce, cii, ct) with a pointer to search_tax_code for their meanings. An agent can distinguish it from search_tax_code and get_jo_act without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('read an article before quoting it, and name it by code and number') plus the alternative route for finance laws ('use get_jo_act to read a finance law that a note names'). It also states the tool is Algeria-only, so the caller knows when not to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tax_ratesGet the business tax rates of a countryARead-onlyInspect
Get the business tax rates in force in 2026 for a country: the corporate income tax (the standard rate where there is one, the particular rates by sector or activity and the minimum tax), the value added tax rates and the main withholding tax rates, plus, for Algeria, the IRG income tax scale of CIDTA art. 104 (personal_income_tax: the scale of individuals, which the monthly withholding on salaries also applies, with abatements) and the IFU flat tax of micro-businesses (flat_tax: 5 % and 12 % up to 8,000,000 DA, 0.5 % for the auto-entrepreneur; eligibility and the nineteen excluded activities are in the notes of the record and in calculate_ifu), and, for Morocco, the IR income tax scale (personal_income_tax) and the flat tax of the auto-entrepreneur (flat_tax), each with the legal article it comes from, the date it applies from when the text gives one and the official page it was read on. Algeria (DZ, the default country), Tunisia (TN) and Morocco (MA) have this dataset; for Tunisia, personal_income_tax and flat_tax are null. It is a reading of public texts, not tax advice. Tunisia and Morocco need an API key.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/openWorldHint annotations, the description discloses the API-key requirement per country, the country_not_available and key_required failure modes, the null fields for Tunisia, and the 'reading of public texts, not tax advice' disclaimer. That is meaningful behavioral context an agent could not infer from the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first clause, but the rest is a single sprawling run-on sentence with deeply nested parentheses about Algeria and Morocco that is hard to parse. Detail is disproportionate to the simple two-parameter read operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of describing return contents, and it does enumerate the returned rate categories, the per-entry legal article, effective date and source page. It is dense but covers what an agent needs for this lookup; only the exact response shape remains unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both lang and country are already fully documented in the schema, including defaults, the ISO alpha-2 pattern, and the error behavior. The description adds no new parameter syntax or format detail beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the business tax rates in force in 2026 for a country') and enumerates the exact contents returned (corporate income tax, VAT, withholding, plus country-specific personal_income_tax and flat_tax). An agent can distinguish this from siblings like get_vat_regimes or get_social_contributions without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real operational context: DZ is the default, only DZ answers without an API key, TN and MA return key_required, and list_countries shows which countries/datasets are live. It also points to calculate_ifu for IFU eligibility. It stops short of an explicit 'use this instead of X when Y' routing statement against the tax siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_vat_regimesGet the VAT regimes of AlgeriaARead-onlyInspect
Get the VAT (TVA) regimes of Algeria in force in 2026, each item with its legal basis (article of the Code des taxes sur le chiffre d'affaires and the finance law that set it) and the official text it was read in: the standard rate of 19 % (CTCA art. 21); the reduced rate of 9 %, which applies ONLY to the items listed in CTCA article 23 (31 of the 36 points of the article are in force, points 7, 11, 18, 31 and 34 being abrogated; LF 2026 art. 53 rewrote points 5, 9, 19 and 21: rehabilitation of old housing, catering and lodging of patients, education, teaching and vocational training supplied by State-approved enterprises, bus passenger transport; also new housing, medical acts, rail transport, listed food products, electricity and gas for small consumption, taxis, drinking water for households, cinema tickets, recoverable waste, tilapia products; sugar left the list in 2022); the exemptions (CTCA art. 8, 9, 10, 11, 13 and 42: exports with the right to deduct, bread, flours, milk, medicines, insurance, bank loans for housing, animal feed, vehicles of war invalids, imports under suspensive regimes, purchases under franchise, labelled start-ups' equipment..., and the temporary finance-law exemptions running to 31 December 2026: dried legumes, rice, fresh produce, eggs and poultry, internet access and web hosting, electricity and gas infrastructure); what is outside the scope (IFU taxpayers and auto-entrepreneurs, CTCA art. 8-2); and the rules that no longer exist (no 0 % rate since the 2020 supplementary finance law; online sales left the 9 % list in LF 2022 and are taxed at 19 %). Use it before saying which VAT rate applies to an activity: an activity that is not in the 9 % list or the exemptions is taxed at 19 %, unless the business is under the IFU or the auto-entrepreneur status. Filters: q (words that must all appear, accents ignored, e.g. "formation"), treatment (standard_19, reduced_9, exempt, outside_scope, abrogated, regime, territoriality) and in_force (false also lists the abrogated rules). Algeria only (country DZ); other countries return country_not_available.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Words that must all appear in the item (label, legal basis), accents and case ignored, for example formation, export, logement, IFU. | |
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
| in_force | No | false also lists the rules that were abrogated (by default only the rules in force). | |
| treatment | No | Only the items of this treatment. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful operational context beyond that: 'Algeria only (country DZ); other countries return country_not_available' and the key_required behaviour for TN/MA, plus the note that abrogated rules are excluded by default.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the body is a sprawling wall of text that dumps the entire substantive VAT content — article numbers, abrogated points, individual exempt goods, historical changes — most of which is answer content rather than selection or invocation guidance. Much of it does not earn its place in a tool description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description does compensate by describing what each item carries (legal basis, article, finance law, official text read in) and by covering scoping, error cases and default filtering. An agent has enough to call it correctly, though the sheer volume makes the operative guidance harder to extract.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter, including the q example and the treatment enum values. The description's 'Filters: q ..., treatment ..., in_force ...' paragraph largely restates that structured content, adding only a sample query word ('formation'), so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Get the VAT (TVA) regimes of Algeria in force in 2026' — and immediately enumerates what a returned item contains (legal basis, article, finance law, official text). It is clearly distinct from siblings like get_tax_rates or get_tax_code_article, which cover rates or single articles rather than the full regime list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit decision rule: 'Use it before saying which VAT rate applies to an activity: an activity that is not in the 9 % list or the exemptions is taxed at 19 %, unless the business is under the IFU or the auto-entrepreneur status.' That is strong when-to-use guidance, but it never names the alternative tools (e.g. calculate_ifu, get_tax_rates) or states when this tool is the wrong choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_wilayaGet a wilaya or governorateARead-onlyInspect
Get one Algerian wilaya by its two-digit code, for example 16 for Alger: its names, capital, region, population and the details of its local CNRC (trade register) and CASNOS (social security of the self-employed) offices. For Tunisia (country TN) pass the governorate code, for example 11 for Tunis: its ISO 3166-2 code, national statistics (INS) code, names in the three languages and chief town. For Morocco (country MA) pass the region code, for example 06 for Casablanca-Settat: its ISO 3166-2 code, names in the three languages and chief town. Returns an error when the code is unknown. Use list_wilayas to see the codes. Tunisia and Morocco need an API key.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Wilaya code, two digits, for example 16 for Alger or 31 for Oran. For Tunisia (country TN) it is the governorate code, two digits, the number of its ISO 3166-2 code, for example 11 for Tunis (TN-11); TN-11 is accepted too. For Morocco (country MA) it is the region code, two digits, the number of its ISO 3166-2 code, for example 06 for Casablanca-Settat (MA-06); MA-06 is accepted too. Find codes with list_wilayas. | |
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, but the description adds real behavioral context: unknown codes error out, only live countries answer, TN/MA require an API key, and specific failure codes (country_not_available, key_required) are named. That is material information an agent cannot get from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and code format, then branches by country. It is somewhat long and repeats per-country code examples already present in the schema, but with no output schema the field enumerations earn their space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so per country (names, capital, region, population, CNRC/CASNOS offices; ISO 3166-2, INS code, three-language names, chief town). Auth, error behavior and the code-discovery alternative are all covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents code, lang and country in detail including the same examples (16 for Alger, TN-11, MA-06). The description largely restates that per-country code semantics rather than adding new syntax or format meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get one Algerian wilaya by its two-digit code') and immediately scopes the tool across three countries with distinct semantics. It is clearly distinguishable from the sibling list_wilayas, which it names as the code-discovery route.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear entry condition (a two-digit code, obtained via list_wilayas), states the failure mode ('returns an error when the code is unknown'), and notes that TN/MA need an API key. It routes to a sibling but does not state an explicit when-not-to-use case beyond that.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_communesList the communes of Algeria with their postal codesARead-onlyInspect
List the communes (baladiyas) of Algeria from Algérie Poste's official data, read every day: each with its four-digit commune code, its French and Arabic names, its wilaya (number and names), its wilaya under loi n° 26-06 of 2026 when it is one of the 108 communes of the 11 wilayas that law created (wilaya_2026: its number 59 to 69 and slug), its postal codes and how many post offices and ATMs it has, and its daïra (daira: name, kind, wilaya; décret exécutif n° 91-306 as amended, Algiers' circonscriptions administratives). Filter by daira, by wilaya (a number from 1 to 69, 59 to 69 being the wilayas of 2026, or their slug such as aflou, barika, bou-saada) and by q (a name in French or Arabic, accents ignored, or the start of a postal code). Use it to check that a commune exists, to find its postal codes, or to list the communes a delivery zone covers. Algérie Poste lists 1,540 communes (those with a post office); the law counts 1,541. Without an API key, at most 10 rows. Algeria only.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | A commune name in French or Arabic (accents ignored), or the first digits of a postal code. | |
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| daira | No | Only the communes of this daïra (or Algiers circonscription administrative), by name, accents ignored. | |
| limit | No | Maximum number of results in the page, from 1 to 100. Defaults to 20. Without an API key at most 10 rows come back. | |
| offset | No | Number of results to skip, from 0 to 10000, to read the next pages. Defaults to 0. meta.total tells how many results match. Without an API key it must be 0: a search cannot be paged. | |
| wilaya | No | A wilaya number from 1 to 69 (16 for Alger, 59 to 69 the wilayas of 2026), or the slug of a wilaya created in 2026 (aflou, barika, el-kantara, bir-el-ater, el-aricha, ksar-chellala, ain-ouessara, messaad, ksar-el-boukhari, bou-saada, el-abiodh-sidi-cheikh). | |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, so the description carries the operational burden and does so well: no-API-key truncation to 10 rows, offset must be 0 without a key (no paging), only DZ answers unauthenticated while TN/MA return key_required, non-covered datasets return country_not_available, and the data is refreshed daily. It also discloses the 1,540-vs-1,541 count discrepancy between the source and the law.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the core sentence is a single run-on enumeration of every returned field, and domain trivia such as 'décret exécutif n° 91-306' does not help an agent select or invoke the tool. It is information-dense rather than concise, and harder to scan than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must describe the return shape itself, and it enumerates every field (commune code, FR/AR names, wilaya, wilaya_2026, postal codes, post-office/ATM counts, daïra). Combined with filter semantics and the API-key/pagination caveats, an agent has everything needed for a 7-parameter, zero-required tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning: it ties wilaya numbers 59–69 to loi n° 26-06 and lists the 2026 slugs, explains that q ignores accents and accepts a postal-code prefix, and clarifies daïra includes Algiers' circonscriptions administratives. Some of this duplicates the schema, keeping it below a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (communes/baladiyas of Algeria) and enumerates the fields returned, including the 2026-wilaya and daïra dimensions. An agent can tell this apart from get_commune (single lookup), list_wilayas and list_dairas without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names three use cases: checking a commune exists, finding postal codes, and listing the communes a delivery zone covers, plus which filters to combine (daira, wilaya, q). It lacks an explicit contrast with the sibling get_commune for the single-record case, so it stops short of full when-to-use/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_countriesList the countries of the dataARead-onlyInspect
List the countries this server has business data for: for each its ISO code, its names in French, Arabic and English, the languages and the currency, its status (live: the data is served, planned: announced and not served yet) and the datasets it has. Algeria (DZ) is live with twelve datasets, the nine of its first release and its tax rates, social contributions and institutions, and Tunisia (TN) and Morocco (MA) with five each (governorates or regions, company legal forms, tax rates, social contributions, institutions); Morocco (MA) also has the index of its official gazette, the Bulletin officiel (list_jo_years, list_jo_issues, get_jo_issue), and Tunisia (TN) the index of its own, the Journal Officiel de la République Tunisienne (JORT), through the same three tools. Tunisia (TN) also has the activity nomenclature NAT 2009 (search_activity_codes, get_activity_code), the sections and chapters of its customs tariff (customs_tariff_sections, customs_tariff_chapters) and the CNSS contribution of the self-employed (calculate_casnos), the regime of the auto-entrepreneur as the finance law 2023 states it (search_anae_activities, get_anae_activity with the key regime; the official list of activities is not loaded) and the single contribution of the auto-entrepreneur (calculate_ifu with regime ae). Morocco (MA) also has the NMA 2010 activity nomenclature (activities), the auto-entrepreneur regime with its excluded professions (anae) and the auto-entrepreneur tax calculator (ifu). Use it first to see which countries and datasets exist before asking another tool for a country, or after a call came back country_not_available. Every country carries free_access: true when it answers without an API key (today Algeria only), false when it needs one. It takes no country, only the optional lang.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/openWorldHint annotations, it discloses the status semantics (live = data served, planned = announced but not served) and the free_access flag semantics (true when no API key is needed, false when one is required, today Algeria only). This is exactly the kind of auth/availability context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, but the body is a very long enumeration of every country's datasets and mapped tools, and the critical 'Use it first...' guidance is buried at the end. The dataset inventory is relevant but oversized for a one-parameter list tool, so it reads as dense rather than wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must explain the return shape — and it does, spelling out every field per country plus the status and free_access flags. Combined with the usage guidance and the note that no country argument is accepted, an agent has everything needed to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single optional 'lang' enum is fully documented in the schema (fr default, ar, en), so the schema carries the parameter burden. The description's only addition is 'It takes no country, only the optional lang', which is a mild restatement of what the schema already shows. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('List the countries this server has business data for') and enumerates exactly what each entry contains (ISO code, names, languages, currency, status, datasets). It is unmistakably distinct from every sibling (list_wilayas, list_jo_years, get_activity_code, etc.), which are country-specific lookups. An agent can route to it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States explicitly when to call it: 'Use it first to see which countries and datasets exist before asking another tool for a country, or after a call came back country_not_available.' It further maps each dataset to the sibling tools that serve it (list_jo_years/get_jo_issue, search_activity_codes, calculate_ifu, etc.), giving concrete routing guidance rather than leaving alternatives implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_dairasList the daïras of Algeria and their communesARead-onlyInspect
List the daïras of Algeria, each with its communes (four-digit Algérie Poste code and name), as décret exécutif n° 91-306 du 24 août 1991 fixant la liste des communes animées par chaque chef de daïra sets them, with its amendments of 1992, 2018, 2021, 2025 and 2026 applied, read in the Journal officiel (meta.sources lists every text with its issue and PDF). The wilaya of Algiers (16) is organised in 13 circonscriptions administratives (décret présidentiel n° 2000-45), given with kind circonscription administrative. 69 wilayas, 553 daïras, 1,541 communes; Larbaa (daïra of Bouzina, Batna) has no post office and so no code. Filter by wilaya (1 to 69) and q (a daïra or commune name, accents ignored). Without an API key, at most 10 rows. Algeria only.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | A daïra or commune name, accents ignored. | |
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| limit | No | Maximum number of results in the page, from 1 to 100. Defaults to 20. Without an API key at most 10 rows come back. | |
| offset | No | Number of results to skip, from 0 to 10000, to read the next pages. Defaults to 0. meta.total tells how many results match. Without an API key it must be 0: a search cannot be paged. | |
| wilaya | No | A wilaya number from 1 to 69. | |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint; the description adds substantial beyond that: the unauthenticated 10-row cap, the requirement that offset be 0 when unauthenticated, the country gate where only DZ answers, the special Algiers circonscription administrative case, and the Larbaa no-post-office edge case.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and return shape are front-loaded, but the definition is one long run-on sentence burdened with full legal citations (décret exécutif n° 91-306…, décret présidentiel n° 2000-45) that are hard for an agent to scan. The procedural detail is useful but packed rather than structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still conveys the return shape (daïras with communes, codes, names), the meta.sources and meta.total fields, pagination behavior, and the auth-dependent limits. For a filtered-list tool this is complete enough to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter including enums, defaults, and limits. The description restates wilaya (1 to 69) and q (accents ignored) but adds no new syntax or format detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (list daïras of Algeria) and precisely what each row contains (communes with four-digit code and name). It is clearly distinguishable from siblings like list_communes, list_wilayas, and get_commune, and adds authoritative scope (553 daïras, 1,541 communes).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete filtering guidance ('filter by wilaya (1 to 69) and q, accents ignored') and constraints ('Without an API key, at most 10 rows', 'Algeria only'). It does not, however, explicitly name an alternative tool or state when to prefer a different sibling such as list_communes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_institutionsList the key public bodies of a countryARead-onlyInspect
List the key public bodies a company deals with in a country, each with its official website, a one-line role and the official page it was read on. Use it to find which body handles a formality. Algeria (DZ, the default country): the trade register (CNRC), the investment promotion agency (AAPI), the tax administration (DGI), social security (CNAS for employees, CASNOS for the self-employed), customs, the statistics office (ONS), the Bank of Algeria and the auto-entrepreneur agency (ANAE); each Algerian role names the act that sets the body up when its Journal officiel text was read (decree 92-68 for the CNRC, decree 22-298 for the AAPI, decree 26-258 for the CNAS and the CASNOS, decree 23-196 for the ANAE, law 23-09 for the Bank of Algeria) and marks what no text confirmed as TO VERIFY (À VÉRIFIER). Tunisia (TN): the business register, the investment authority, the industry agency, the tax administration, social security, customs, the statistics institute and the central bank. Morocco (MA): the regional investment centres (CRI), the company register office (OMPIC), the tax administration, social security, customs, the statistics office (HCP) and the central bank. The list is short and takes no filter. Tunisia and Morocco need an API key.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds genuinely useful behavior detail: TN and MA require an API key, unsupported countries error out, roles lacking a Journal officiel text are marked TO VERIFY, and each Algerian role cites its establishing act. The remaining gap is that it doesn't say what an error or empty response looks like for an unavailable country.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is well front-loaded, but the body then enumerates the actual answer contents — CNRC, AAPI, DGI, CNAS, CASNOS, ONS, decree numbers, Moroccan CRI/OMPIC/HCP — which an agent cannot use for selection or invocation. These enumerations constitute most of the description and crowd out the operational guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-optional-parameter read-only list with no output schema, the description covers supported countries, the default, the API-key constraint and the fact that no filter applies, which is everything needed to call it correctly. It does not describe the shape of a response entry, but that is minor given the enumerated contents.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both `lang` and `country` are already fully documented with enum, default, pattern and the country_not_available/key_required behavior. The description restates the DZ-default and the per-country coverage but adds no syntax or semantics beyond the schema — baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb (List) and resource (key public bodies a company deals with in a country) plus what each entry contains (official website, one-line role, source page). It is clearly distinct from siblings such as list_countries, which enumerates available datasets rather than bodies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use it to find which body handles a formality" gives a concrete triggering scenario, and the closing note that the list takes no filter sets expectations. It does not explicitly state when to use list_countries instead, though the schema does; the description itself stops short of naming alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_jo_issuesList the Journal Officiel issues of a yearARead-onlyInspect
List the issues of the Algerian Journal Officiel for one year: for each issue its number, whether the French and Arabic editions exist with the links to their official PDF files on joradp.dz, and whether UpGrowth holds its summary. For Morocco (country MA) it lists the issues of the Bulletin officiel for one year, from 1912: for each issue its number, its publication date and the links to its French and Arabic editions on sgg.gov.ma (editions.fr and editions.ar, each with available true or false and pdf_url); a supplement (bis, ter) is listed beside its issue, with its suffix. For Tunisia (country TN) it lists the issues of the JORT for one year, from 1956: for each issue its number within the year, its publication date and whether its French and Arabic editions exist; the official site gives no direct link to the PDF files, so pdf_url is null. Returns an error when no issue is indexed for the year. Use it to find the number of an issue, then get_jo_issue to see what the issue contains. Without an API key only Algeria answers, for the current year and the two before it (older years return key_required), and at most 10 issues come back: meta.truncated says when more exist.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| year | Yes | Year of the gazette: the Journal Officiel from 1962 for Algeria, the Bulletin officiel from 1912 for Morocco (country MA), the Journal Officiel de la République Tunisienne from 1956 for Tunisia (country TN). Find the years covered with list_jo_years. Without an API key only Algeria answers, for the current year and the two before it; older years come with a paid plan. | |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint/openWorldHint; the description adds genuinely new behavior: error on empty year, key_required responses for TN/MA and for older DZ years without a key, 10-issue cap signalled via meta.truncated, and pdf_url=null for Tunisia. These are operational traits the agent could not infer from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the per-country behavior is organized in parallel clauses, with the sibling routing and quota caveats at the end. It is long, and the API-key/paid-plan warning is repeated from the year parameter's own schema text, which is minor waste but the content is largely load-bearing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by enumerating exactly what is returned per country (issue number, publication date, edition availability with pdf_url, supplement suffixes). Combined with the free-tier and truncation notes, an agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents country codes, the per-country start years (1912/1956/1962) and the lang enum. The description restates the same year ranges and country mapping rather than adding new parameter semantics, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb plus resource ('List the issues of the Algerian Journal Officiel for one year') and it spells out exactly what each returned record contains. It also differentiates the three country datasets, so an agent can distinguish it from get_jo_issue, list_jo_years and search_jo_titles immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes usage: 'Use it to find the number of an issue, then get_jo_issue to see what the issue contains', and points to list_jo_years for discovering covered years. It also states failure conditions (error when no issue is indexed) and the free-tier limitation, which tells the agent when this tool will not serve the need.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_jo_yearsList Journal Officiel yearsARead-onlyInspect
List the years covered by the index of the Journal Officiel de la République Algérienne (JORA), the official gazette in which Algerian laws, ordinances, decrees and orders are published, from 1962, newest year first. For each year: its number of issues, the last issue number, how many issues have a French and an Arabic edition, and for how many issues UpGrowth holds a summary. For Morocco (country MA) it lists the years of the Bulletin officiel du Royaume du Maroc, the Moroccan official gazette, from 1912: its French and Arabic editions (the French translation edition holds fewer issues) and no summaries. For Tunisia (country TN) it lists the years of the Journal Officiel de la République Tunisienne (JORT), the Tunisian official gazette, from 1956: its French and Arabic editions and no summaries. Use it first, to see which years exist before listing the issues of a year. Without an API key only Algeria answers, and meta.free_years lists the years it may read: the other years need a key. Takes only the optional lang and country.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations give readOnlyHint=true and openWorldHint=false, and the description goes well beyond that: it discloses the free-tier limitation per country, the meta.free_years escape hatch, and the specific error codes (country_not_available, key_required). It also describes the return payload per country (issue counts, last issue number, French/Arabic edition coverage, summary counts).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the 'use it first' directive are front-loaded, and the per-country paragraphs carry real information about differing coverage dates and return fields. However, the Morocco and Tunisia passages repeat country semantics that the schema's country parameter already states, making it longer than strictly needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned fields per year (issue count, last issue number, bilingual edition counts, summary coverage). Combined with the auth/error behavior, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are already fully documented with enums, defaults and country semantics. The description's 'Takes only the optional lang and country' restates the schema rather than adding new meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List the years covered by the index of the Journal Officiel') and immediately scopes it to three named gazettes. It is clearly distinguishable from siblings like list_jo_issues and search_jo_titles, which operate at issue/title granularity rather than year granularity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit sequencing: 'Use it first, to see which years exist before listing the issues of a year' names both the when and the downstream tool. It also documents the precondition that without an API key only Algeria answers and that TN/MA return key_required, which is actionable routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_wilayasList wilayas and governoratesARead-onlyInspect
List the wilayas (provinces) of Algeria: 69 since loi n° 26-06 of 4 April 2026 (Journal officiel n° 25): the 58 numbered ones, then the 11 created by that law (Aflou, Barika, El Kantara, Bir El Ater, El Aricha, Ksar Chellala, Aïn Ouessara, Messaad, Ksar El Boukhari, Bou Saada, El Abiodh Sidi Cheikh), numbered 59 to 69 by décret présidentiel n° 26-206 of 25 May 2026 (Journal officiel n° 40), which come with their mother wilaya, their communes and in_place_by (their mother wilaya runs them until 31 December 2026 at the latest). For each wilaya in the dataset, with their two-digit code, their names in the three languages, capital, region and population, the address and phone of the local CNRC (trade register) office and the address of the local CASNOS (social security of the self-employed) office. Codes, names and capitals come from décret 84-79 (01 to 48), décret présidentiel 21-117 (49 to 58) and décret présidentiel 26-206 (59 to 69), cited in meta.sources; population, region, office details and websites do not come from the Journal officiel (meta.fields_not_from_jo). Use it to turn a wilaya code into a name or the reverse, or to find the local offices for a company registration or a CASNOS affiliation. For Tunisia (country TN) it lists the 24 governorates instead: code, ISO 3166-2 code, national statistics (INS) code, names in the three languages, chief town and the official source, and the answer names every page it was read on. For Morocco (country MA) it lists the 12 regions of the 2015 division the same way: code, ISO 3166-2 code, names in the three languages, chief town and the official source. The list is short and takes no filter. Tunisia and Morocco need an API key.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/openWorldHint annotations it discloses key operational traits: 'Tunisia and Morocco need an API key,' and no-key behavior (TN/MA return key_required), plus the country_not_available failure mode. This is meaningful behavioral context an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, but the body is a dense wall of legal provenance (loi n° 26-06, décret présidentiel 26-206, Journal officiel numbers, in_place_by deadlines) that does not help an agent select or invoke the tool. Much of it fails the 'every sentence earns its place' test.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates thoroughly by enumerating the returned fields per country (code, ISO/INS codes, trilingual names, capital/chief town, region, population, CNRC/CASNOS office details). An agent knows what to expect back and which auth is required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both lang and country are already documented in the schema. The prose largely restates country routing (DZ/TN/MA) and language choice rather than adding syntax or edge-case detail beyond it, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names the specific resource and scope (wilayas/provinces of Algeria, plus TN governorates and MA regions) with a clear list verb. An agent can distinguish it from the singular get_wilaya and from list_communes/list_dairas without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete use cases: 'turn a wilaya code into a name or the reverse, or to find the local offices for a company registration or a CASNOS affiliation,' and states the list takes no filter. It does not explicitly name get_wilaya as the single-record alternative, so the when-not is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_activity_codesSearch CNRC activity codesARead-onlyInspect
Search the official Algerian nomenclature of commercial activities kept by the CNRC (Centre National du Registre du Commerce): the six-digit codes written on a trade register entry. Use it to find the code of an activity described in French, Arabic or English, to read the CNRC status of an activity (libre, reglementee or bloquee: meta.status_note says what each means and what it does not prove) or to browse the activities of a sector. The status, the authority, the authorization and the references of a code are the CNRC's own, from its nomenclature of economic activities (NAE, executive decree 15-249 of 29 September 2015, content updated by order of the minister of commerce); that nomenclature is not a list of the activities that need a licence, and a libre code may still need a sector title. get_activity_code adds details.jo_check where UpGrowth found the Journal officiel contradicting or not settling the CNRC text. Returns a page of activities, each with its code, status, labels in the three languages, sector, group and the URL of its page on upgrowth.dz. meta.total is the number of matches. For Tunisia (country TN) it searches the official Tunisian nomenclature of activities, the NAT 2009 of the national statistics institute (INS): four-digit class codes (01.11 is written 0111), labels in French only, a section letter A to U as sector, each record citing its official source. The NAT is a statistical classification, not the list of activities that need an authorization: the status comes from a hand-reviewed map of its classes to the authorisations of annex 1 of décret 2018-417, the exclusive list (reglementee with the authorisations and their legal references, libre because the list is exclusive), never libre by default: without the map the status is not_determined. With list=authorisations it searches the authorisations themselves. Tunisia needs an API key. For Morocco (country MA) it searches the official NMA 2010 nomenclature of the Haut-Commissariat au Plan instead: four-digit codes, labels in French, the section letter A to U as sector, the branch and the sub-branch as group; the nomenclature is statistical and gives no authorization regime, so every Moroccan code has the status not_determined, never free. Morocco needs an API key. Without an API key at most 10 rows come back and meta.truncated says when more matched, so do not present such a list as complete. Every row carries its own status, but a truncated list can hide a regulated or blocked code: search again with status=reglementee or status=bloquee, or read get_activity_code, before calling an activity free.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Search text, at most 100 characters. Digits only, for example 5011: matches the activity codes that start with them. Words: every word must start a word of the activity label in French, Arabic or English, so a few specific words work best. Accents and letter case are ignored. Leave it out to browse with the other filters. | |
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| list | No | Tunisia only (country TN): nat (the default) searches the classes of the NAT 2009; authorisations searches the 100 authorisations of annex 1 (and the 27 of annex 2, those to be struck out) of décret gouvernemental n° 2018-417 of 11 May 2018, as records with their conditions, procedures, delays and legal references. Ignored for Algeria and Morocco. Get one with get_activity_code and a code such as A1-017. | nat |
| limit | No | Maximum number of results in the page, from 1 to 100. Defaults to 20. Without an API key at most 10 rows come back. | |
| offset | No | Number of results to skip, from 0 to 10000, to read the next pages. Defaults to 0. meta.total tells how many results match. Without an API key it must be 0: a search cannot be paged. | |
| sector | No | Keep only activities of this sector. Algeria: the CNRC sector, given as its digit: 1 goods production, 2 artisanal production, 3 wholesale distribution, 4 import for resale, 5 retail distribution, 6 services, 7 export. Tunisia (country TN): the section letter of the NAT 2009, A to U, for example C for manufacturing. For Morocco (country MA): the section of the NMA 2010 as its letter, A to U (for example C for manufacturing, G for trade). | |
| status | No | Keep only activities with this status: libre (the CNRC does not mark the code as regulated: not proof that no sector licence is needed), reglementee (regulated: the authorization or agrément that the text of the activity sets is required to exercise it) or bloquee (blocked: a status of the CNRC nomenclature, understood as not registrable under that code; no text of the Journal officiel read defines it and the data does not give the reason). For Tunisia (country TN): reglementee when an authorisation of annex 1 of décret 2018-417 governs the class, libre otherwise (the annex is the exclusive list), not_determined when that map is not loaded. | |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, but the description discloses a great deal beyond them: unauthenticated callers get at most 10 rows with meta.truncated, paging is impossible without a key (offset must be 0), TN and MA require a key, and status semantics differ per country with not_determined as a real state. It also warns that a truncated page can hide a regulated or blocked code.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the core purpose, but the body sprawls into repeated status explanations across three country paragraphs plus a restatement of the truncation caveat. The density of legal citations and per-country caveats makes it hard to scan, and some sentences duplicate schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an eight-parameter, three-country, no-output-schema search tool, the description covers return shape (code, status, labels in three languages, sector, group, upgrowth.dz URL, meta.total), authentication effects, pagination, and per-country data caveats. Nothing an agent needs to invoke or interpret it responsibly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already carries most parameter meaning; the description nonetheless adds value by tying parameters together, e.g. list=authorisations being Tunisia-only and ignored elsewhere, and country gating which datasets answer. It repeats some schema content (status definitions, sector codes), keeping it short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (search) and resource (the CNRC nomenclature of commercial activities, six-digit codes) and scopes it across three datasets. It explicitly distinguishes itself from get_activity_code, which 'adds details.jo_check', so an agent can tell the two siblings apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It enumerates the concrete jobs the tool serves: find the code of an activity described in French, Arabic or English; read a code's CNRC status; browse a sector's activities. It also states when to escalate (get_activity_code) and how to avoid a false 'free' conclusion after a truncated result, which is explicit when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_anae_activitiesSearch ANAE auto-entrepreneur activitiesARead-onlyInspect
Search the list of activities open to the auto-entrepreneur status in Algeria, as the platform of the Agence Nationale de l'Auto-Entrepreneur (ANAE) publishes it, grouped in domains. The list is fixed by an order of the minister in charge of start-ups (executive decree 23-197, art. 8) whose list is attached to the original and not printed in the Journal officiel: this answer is not a Journal officiel text and may lag its latest update (meta.activity_list says so). Liberal professions, regulated professions and activities, and crafts are excluded from the list (law 22-23, art. 2). Use it to check whether an activity can be practised as an auto-entrepreneur and to find its six-digit code. Returns a page of activities with code, labels and domain. meta.total is the number of matches. In Algeria an activity that has a regime of its own, today 080101 (micro-importation), also carries the object regime: read it before answering about that activity, it is not the ordinary auto-entrepreneur regime (see get_anae_activity). For Morocco (country MA) the status is defined by exclusion: it returns the professions that decree 2-15-263 excludes from the auto-entrepreneur status (architects, lawyers, doctors, notaries and so on), each with key (an UpGrowth identifier, code is null: Morocco gives them no code), status excluded and its legal basis; it holds no list of eligible activities. Morocco needs an API key. Without an API key at most 10 rows come back and meta.truncated says when more matched, so do not present such a list as complete. For Tunisia (country TN) there is no list of activities: the one record is the regime of the auto-entrepreneur as the finance law 2023 states it (key regime), and meta.activity_list says that the official list of activities is not loaded, so an activity that is not in the answer is neither admitted nor excluded: never tell a user it is not eligible. Tunisia needs an API key.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Search text, at most 100 characters. Digits only: matches the ANAE codes that start with them. Words: every word must start a word of the activity label in French, Arabic or English. Accents and letter case are ignored. Leave it out to browse by domain. | |
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| limit | No | Maximum number of results in the page, from 1 to 100. Defaults to 20. Without an API key at most 10 rows come back. | |
| domain | No | Keep only activities of this ANAE domain, given by its six-digit domain code (it ends in 0000), for example 010000 for Advice, Expertise and Training. Every result carries its domain. Not used for Tunisia (country TN): it has one regime record and no domains. | |
| offset | No | Number of results to skip, from 0 to 10000, to read the next pages. Defaults to 0. meta.total tells how many results match. Without an API key it must be 0: a search cannot be paged. | |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the annotations (readOnlyHint, openWorldHint). It discloses API-key gating, a 10-row cap without a key, meta.truncated/meta.total semantics, that offset must be 0 without a key, that Morocco returns excluded professions with no codes, and that Tunisia returns only a regime record and absences are never proof of ineligibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the primary purpose before the per-country caveats. It is long and dense, but nearly every sentence carries operational information an agent needs; the volume is justified by the three-country branching, though paragraph form makes it heavier than ideal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully carries the return contract: code, labels, domain, key, status, legal basis, and the meta.total/truncated fields. The API-key and pagination behaviors are covered, leaving nothing an agent needs in order to call and interpret it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter is thoroughly documented in the schema itself (q matching rules, limit/offset caps, domain pattern, country codes). The description reinforces a few constraints (10-row cap, offset=0 without key, domain unused for TN) but adds little beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and resource (list of activities open to the auto-entrepreneur status in Algeria), plus the legal basis and exclusions that define the list. It clearly distinguishes the tool from get_anae_activity (which reads a single activity's regime) and from the generic code search siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the use case: 'check whether an activity can be practised as an auto-entrepreneur and to find its six-digit code', and routes the agent to get_anae_activity for the special micro-importation regime. It gives rich per-country conditions but does not explicitly contrast against sibling search_activity_codes, so it falls short of full alternative coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_jo_textSearch the full text of the Journal OfficielARead-onlyInspect
Search the full text of the acts published in the Algerian Journal Officiel since 1962 (French edition: laws, ordinances, presidential and executive decrees, orders, decisions, Bank of Algeria regulations, corrigenda), not only their titles. Each match gives the year, the issue, the place of the act in the issue (ord), its type, its number when it has one, its title, its first page, an excerpt around the words and the links to the issue page and the official PDF; get_jo_act then returns the whole text. Words are matched in French with accents and case ignored and plurals folded (for example "redevance dossiers investissement"); quotes search an exact phrase, OR offers alternatives and a leading minus excludes a word. Best matches first. Use it to find which text sets a rule, a rate, an amount or a procedure, then read that text with get_jo_act before quoting it. The text is the official one as published: an act amended since appears as it was printed. From 2002 the text is the one of the official PDF (source pdf); from 1962 to 2001 it was read from the scans by three independent machine readings, each word kept when two of them agree (source scan), and a passage no two readings gave alike is marked [[? ... ?]] (uncertain counts them in an act): check such a passage on the PDF before quoting it. Without an API key, only the current year and the two before it, and at most 10 matches (meta.free_years, meta.truncated). Algeria only (country DZ); other countries return country_not_available.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Words to find in the text, accents and case ignored, for example redevance traitement dossiers investissement, or a phrase in quotes. | |
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| type | No | Only the acts of this kind. | |
| year | No | Only the acts published that year (2002 or later). | |
| limit | No | Maximum number of results in the page, from 1 to 100. Defaults to 20. Without an API key at most 10 rows come back. | |
| offset | No | Number of results to skip, from 0 to 10000, to read the next pages. Defaults to 0. meta.total tells how many results match. Without an API key it must be 0: a search cannot be paged. | |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true and openWorldHint=false; the description adds a great deal beyond them: 1962–2001 scan vs 2002+ PDF provenance, [[? ... ?]] uncertainty markers, free-tier caps (current year + two, max 10 matches, meta.free_years/meta.truncated), Algeria-only with country_not_available/key_required errors. This goes well past the safety hints, so it earns more than the annotation baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and search syntax are front-loaded, followed by match fields, provenance caveats and limits. Dense but nearly every sentence earns its place; the parenthetical enumeration of act types is heavy but informative for this domain.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned fields (year, issue, ord, type, number, title, page, excerpt, links) and covering error/limit behavior and source-reliability caveats. An agent has everything needed to call and interpret it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds query semantics the schema does not: plural folding, OR alternatives, and a leading minus to exclude. It also reinforces the country restriction in prose, adding meaning beyond the enum.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search the full text of the acts published in the Algerian Journal Officiel since 1962') and explicitly contrasts with the sibling search_jo_titles ('not only their titles'). An agent can immediately tell it apart from title-search and other JO tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete use case ('find which text sets a rule, a rate, an amount or a procedure') and names the follow-up tool explicitly ('then read that text with get_jo_act before quoting it'). The when-to-use path and the alternative for full text are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_jo_titlesSearch Journal Officiel titlesARead-onlyInspect
Search the official titles of the texts listed in the summaries (sommaires) of the Algerian Journal Officiel: laws, ordinances, decrees, orders and notices. Each match gives the year and issue number, the section heading, the title and the links to the issue page and to its official PDF. Use it to find when and where a text was published. Only the issues whose summary UpGrowth holds are searched: every year from 1962 to today (without an API key, only the current year and the two before it, and at most 10 matches: meta.free_years and meta.truncated say so; meta.sommaire_years lists the years searched). The summaries of 1962 to 2001 are read from the scanned issues: a title is listed only when two of three independent readings give it word for word (the third, by Opus, settles what the first two dispute), 98 % of the entries, so an empty result does not prove that a text does not exist (search_jo_text searches their full text too), and those hits have no upgrowth.dz page (url is null, pdf_url links the official scan). Optionally restrict it to one year. Returns a page of matches; meta.total is their number. Algeria only: no Moroccan summaries are held yet, so country MA returns country_not_available, and so does country TN.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Words to look for in the official titles of the texts, for example loi de finances 2026. Every word must start a word of the title; accents and letter case are ignored. From 2 to 100 characters. | |
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| year | No | Search only the issues of this year (1962 or later). Leave it out to search every year. Without an API key only the current year and the two before it can be searched; older years come with a paid plan. | |
| limit | No | Maximum number of results in the page, from 1 to 100. Defaults to 20. Without an API key at most 10 rows come back. | |
| offset | No | Number of results to skip, from 0 to 10000, to read the next pages. Defaults to 0. meta.total tells how many results match. Without an API key it must be 0: a search cannot be paged. | |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Well beyond the readOnlyHint annotation, it discloses corpus coverage (1962–today), free-tier caps (current year + two prior, max 10 matches), the meta fields that report those caps, the two-of-three OCR arbitration rule behind 1962–2001 entries, and that those hits have url=null and a scan PDF. This is unusually rich behavioral context for a read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key scoping facts (what is searched, coverage, caps, OCR caveat) are front-loaded and each sentence carries information. However, it is delivered as one very dense paragraph with some restatement of schema-level facts (country codes, year bounds), which makes it heavier than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing the return shape (year, issue number, section heading, title, issue page and PDF links, meta.total) and the important edge cases (empty result ambiguity, null url for scanned years, country_not_available/key_required). Nothing an agent needs to interpret results correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter, and the description largely restates it. It does add modest semantic value by framing year as an optional narrowing ('Optionally restrict it to one year') and by surfacing meta.total as the pagination anchor, but does not supplement the q matching rules or limits beyond what the schema says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search the official titles of the texts listed in the summaries of the Algerian Journal Officiel') and enumerates the text types covered. It is clearly distinguishable from siblings like search_jo_text (full text), get_jo_act and list_jo_issues.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit use case ('find when and where a text was published') and an explicit alternative route: an empty result does not prove absence, so use search_jo_text for full text. It also states the country exclusion (MA/TN return country_not_available) rather than leaving it to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_post_officesSearch the post offices and ATMs of AlgeriaARead-onlyInspect
Search Algérie Poste's post offices (kind post_office, the default) or ATMs (kind atm) by name or address words (q, accents ignored), by postal code (all five digits, or the first ones), by commune code, by wilaya, or around a place (lat and lng in decimal degrees, within radius_km, 10 by default: nearest first, with distance_km). Each post office comes with its class, address, postal code and former postal code, GPS position and commune; each ATM with whether it works. Use it to find the post office of a postal code, the offices of a delivery zone, or the nearest office or ATM to an address. Data read from Algérie Poste every day. Without an API key, at most 10 rows. Algeria only.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Words of the name or the address, accents ignored. | |
| lat | No | Latitude of the place to search around, with lng. | |
| lng | No | Longitude of the place to search around, with lat. | |
| kind | No | post_office (default) or atm. | |
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| limit | No | Maximum number of results in the page, from 1 to 100. Defaults to 20. Without an API key at most 10 rows come back. | |
| offset | No | Number of results to skip, from 0 to 10000, to read the next pages. Defaults to 0. meta.total tells how many results match. Without an API key it must be 0: a search cannot be paged. | |
| wilaya | No | A wilaya number from 1 to 69, or the slug of a wilaya created in 2026. | |
| commune | No | A four-digit commune code. | |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
| radius_km | No | Search radius around lat and lng, in km (10 by default). | |
| postal_code | No | A postal code, or its first digits (16 for every code of wilaya 16). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint/openWorldHint already covering the safety profile, the description adds real behavioral context: data refreshed daily from Algérie Poste, the 10-row cap without an API key, the fact that paging requires a key, and the country_not_available / key_required error behaviors. It also discloses nearest-first ordering and the presence of distance_km in results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The search modes are front-loaded and each sentence carries information (matching modes, result fields, limits, region restriction). It is dense and long for a single block, but there is little filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing returns and does so: each post office comes with class, address, postal code, former postal code, GPS position and commune, each ATM with operational status. Together with the limit/key notes and country restriction, nothing essential for a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes beyond the per-field schema text by explaining how parameters interact (lat/lng searched within radius_km, 10 by default, returned nearest-first with distance_km) and by clarifying that postal codes may be partial (all five digits or the first ones).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search Algérie Poste's post offices ... or ATMs'), names the default kind, and covers the whole scope (Algeria only) in the opening sentence. No sibling tool touches postal data, so the agent can route to it unambiguously.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use scenarios ('find the post office of a postal code, the offices of a delivery zone, or the nearest office or ATM to an address'). It does not name alternative tools or state exclusions, but no sibling overlaps, so the guidance is clear without being exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_tax_codeSearch the tax codes of Algeria, article by articleARead-onlyInspect
Search the six tax codes of Algeria in their 2026 editions, as the Direction générale des impôts (DGI) publishes them, article by article: cidta (Code des impôts directs et taxes assimilées: IRG, IBS, IFU, TAP), cpf (Code des procédures fiscales: audits, assessments, penalties, appeals, limitation periods), ctca (Code des taxes sur le chiffre d'affaires: VAT), ce (Code de l'enregistrement: registration duties), cii (Code des impôts indirects) and ct (Code du timbre: stamp duty). Every word of q must appear in the article, in French, accents and case ignored (for example taux normal, retenue source, prescription); a phrase between quotes is searched as it is; English and Arabic terms (VAT rate exports, ضريبة القيمة المضافة) are searched through their French equivalents, shown in meta.query_terms, and every match carries a citation line to paste as the source. Each match gives the code and its title, the article number (id, for example 150, 282 quater or 300-3), its heading (the part, title, chapter and section above it), its status (in_force or abrogated), an excerpt of about 300 characters around the rarest word and the link to the official PDF of the code; get_tax_code_article then returns the whole article with its notes. Best matches first: more hits first, a hit in the heading or at the start of the text counts more, abrogated articles rank low. Use it to find which article sets a rate, a deadline, a penalty or a condition, then read that article before quoting it, and name it by code and number (for example CIDTA art. 150). The text is the DGI's consolidated edition: the legal reference stays the Journal officiel, so read the notes of the article, which name the finance laws that created or amended it, and use get_jo_act to read such a law. Filter by code. Without an API key, at most 10 matches. Algeria only (country DZ); other countries return country_not_available.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Words that must all appear in the article (French, accents and case ignored), for example taux normal, retenue source, prescription. A phrase between quotes is searched as it is. | |
| code | No | Only this code: cidta (direct taxes and similar taxes), cpf (tax procedures), ctca (turnover taxes, VAT), ce (registration), cii (indirect taxes) or ct (stamp duty). All six when left out. | |
| lang | No | Language of the labels, notes and attribution text in the answer: fr (French, the default), ar (Arabic) or en (English). | fr |
| limit | No | Maximum number of results in the page, from 1 to 100. Defaults to 20. Without an API key at most 10 rows come back. | |
| offset | No | Number of results to skip, from 0 to 10000, to read the next pages. Defaults to 0. meta.total tells how many results match. Without an API key it must be 0: a search cannot be paged. | |
| country | No | Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required. | DZ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only declaring readOnlyHint and openWorldHint, the description adds substantial behavioral context: French accent/case-insensitive matching, quoted-phrase behavior, English/Arabic translation through meta.query_terms, ranking rules, result fields, citation lines, and a 10-match cap without an API key. It also explains that offset cannot be used without a key and that non-live countries return country_not_available.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and scope, and most sentences contribute operational detail about searching, ranking, reading results, and errors. It is lengthy and includes some repetition of the schema's enum descriptions for the six codes, which keeps it from being maximally concise, but it is dense rather than wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex search tool with no output schema, the description is complete enough to call correctly: it explains result contents, ranking, citation behavior, pagination limits, API-key constraints, and country availability. It also names the follow-up tools needed to read a full article or the underlying Journal officiel law.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds useful meaning beyond the schema: it explains that every word in q must appear, that quoted phrases are searched literally, and that English/Arabic terms are mapped to French equivalents shown in meta.query_terms. It also reinforces the country limitation and no-key paging constraint, though some parameter details are duplicated from the schema rather than extended.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: searching the six Algerian tax codes article by article in their 2026 DGI editions. It enumerates all six codes and their scopes, which clearly distinguishes this tool from article-reading siblings like get_tax_code_article and from broader searches like search_jo_text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states the intended workflow: use search to find which article sets a rate, deadline, penalty or condition, then read that article with get_tax_code_article before quoting it, and use get_jo_act for the underlying finance law. It also explains filtering by code and the country restriction, leaving little ambiguity about when to use this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
- Changed
get_jo_issue1 field changed- changed
Input schema / properties / year / descriptionPrevious value: -"Year of the gazette: the Journal Officiel from 1962 for Algeria, the Bulletin officiel from 1912 for Morocco (country MA), the Journal Officiel de la République Tunisienne from 1956 for Tunisia (country TN). Find the years covered with list_jo_years. Without an API key only Algeria answers, for the current year and the two before it."New value: +"Year of the gazette: the Journal Officiel from 1962 for Algeria, the Bulletin officiel from 1912 for Morocco (country MA), the Journal Officiel de la République Tunisienne from 1956 for Tunisia (country TN). Find the years covered with list_jo_years. Without an API key only Algeria answers, for the current year and the two before it; older years come with a paid plan."
- Changed
list_jo_issues1 field changed- changed
Input schema / properties / year / descriptionPrevious value: -"Year of the gazette: the Journal Officiel from 1962 for Algeria, the Bulletin officiel from 1912 for Morocco (country MA), the Journal Officiel de la République Tunisienne from 1956 for Tunisia (country TN). Find the years covered with list_jo_years. Without an API key only Algeria answers, for the current year and the two before it."New value: +"Year of the gazette: the Journal Officiel from 1962 for Algeria, the Bulletin officiel from 1912 for Morocco (country MA), the Journal Officiel de la République Tunisienne from 1956 for Tunisia (country TN). Find the years covered with list_jo_years. Without an API key only Algeria answers, for the current year and the two before it; older years come with a paid plan."
- Changed
search_jo_titles1 field changed- changed
Input schema / properties / year / descriptionPrevious value: -"Search only the issues of this year (1962 or later). Leave it out to search every year. Without an API key only the current year and the two before it can be searched."New value: +"Search only the issues of this year (1962 or later). Leave it out to search every year. Without an API key only the current year and the two before it can be searched; older years come with a paid plan."
1 tool update
- Changed
get_jo_act1 field changed- added
Input schema / properties / articleAdded value: +{ + "description": "One article of the act, for example 25, 1er, 87 bis or 715 bis 133: returns only that article (article, article_text) instead of the parts. It is the article as printed in that issue, not consolidated: named_in_titles still lists the acts that amended it. For 1962 to 2001 scans the [[? ... ?]] marks stay as they are. not_found when the heading is not recognised: read the parts then.", + "maxLength": 20, + "type": "string" +}
3 tool updates
- Changed
calculate_casnos2 fields changed- changed
Input schema / properties / regime / descriptionPrevious value: -"Algeria: FORFAITAIRE_ACHAT_VENTE, FORFAITAIRE_PRESTATIONS (flat-rate regimes, resale and services), BENEFICE_REEL (actual profit), AUTO_ENTREPRENEUR (flat yearly option) or PREMIERE_ANNEE (first year). Tunisia (country TN): INDEPENDANT_NON_AGRICOLE, INDEPENDANT_AGRICOLE and ARMATEUR_PECHE_30T (ten classes, need income_class); PETIT_AGRICULTEUR, PETIT_ARMATEUR_PECHE and PECHEUR_INDEPENDANT (flat 7.5 % scheme of law 2002-32); ARTISAN (craftsmen of the same law, 7.5 % of 2/3 of the SMIG over 200 hours a month). Morocco (country MA): AUTO_ENTREPRENEUR (decree 2-21-928) or TRAVAILLEUR_NON_SALARIE (the other non-salaried workers: one decree per category, chosen with category)."New value: +"Algeria: FORFAITAIRE_ACHAT_VENTE (flat-rate, goods, 25 %), FORFAITAIRE_PRESTATIONS (flat-rate, services, 35 %), BENEFICE_REEL (actual profit), AUTO_ENTREPRENEUR (24,000 DA option) or PREMIERE_ANNEE (first year). Tunisia (country TN): INDEPENDANT_NON_AGRICOLE, INDEPENDANT_AGRICOLE and ARMATEUR_PECHE_30T (ten classes, need income_class); PETIT_AGRICULTEUR, PETIT_ARMATEUR_PECHE and PECHEUR_INDEPENDANT (flat 7.5 % scheme of law 2002-32); ARTISAN (craftsmen of the same law, 7.5 % of 2/3 of the SMIG over 200 hours a month). Morocco (country MA): AUTO_ENTREPRENEUR (decree 2-21-928) or TRAVAILLEUR_NON_SALARIE (the other non-salaried workers: one decree per category, chosen with category)." - changed
Input schema / properties / revenue / descriptionPrevious value: -"Yearly amount in Algerian dinars (DZD). For the flat-rate regimes send the turnover (chiffre d'affaires) of the previous year; for BENEFICE_REEL send the taxable profit. Needed for those three regimes, ignored for AUTO_ENTREPRENEUR and PREMIERE_ANNEE. Ignored for Tunisia (country TN), whose contribution depends on the income class. For Morocco (country MA, regime AUTO_ENTREPRENEUR) it is required: the yearly amount, in Moroccan dirhams (MAD), of the \"droits annuels\" that select the bracket of the scale of the tax administration."New value: +"Yearly amount in Algerian dinars (DZD). For the flat-rate regimes send the tax turnover (chiffre d'affaires fiscal) of the previous financial year; for BENEFICE_REEL send the ordinary result before tax (résultat ordinaire avant impôt) of the financial year closed and declared the previous year. Needed for those three regimes, ignored for AUTO_ENTREPRENEUR and PREMIERE_ANNEE. Ignored for Tunisia (country TN), whose contribution depends on the income class. For Morocco (country MA, regime AUTO_ENTREPRENEUR) it is required: the yearly amount, in Moroccan dirhams (MAD), of the \"droits annuels\" that select the bracket of the scale of the tax administration."
- Changed
get_tax_calendar1 field changed- changed
Input schema / properties / treatment / enumPrevious value: -[ - "monthly", - "quarterly", - "annual", - "ifu", - "social", - "penalty", - "general" -]New value: +[ + "monthly", + "quarterly", + "semiannual", + "annual", + "advance", + "ifu", + "social", + "penalty", + "general" +]
- Changed
search_activity_codes1 field changed- changed
Input schema / properties / status / descriptionPrevious value: -"Keep only activities with this status: libre (free, no specific authorization needed to register), reglementee (regulated, a prior authorization or permit is required) or bloquee (blocked, cannot be registered in the trade register). For Tunisia (country TN): reglementee when an authorisation of annex 1 of décret 2018-417 governs the class, libre otherwise (the annex is the exclusive list), not_determined when that map is not loaded."New value: +"Keep only activities with this status: libre (the CNRC does not mark the code as regulated: not proof that no sector licence is needed), reglementee (regulated: the authorization or agrément that the text of the activity sets is required to exercise it) or bloquee (blocked: a status of the CNRC nomenclature, understood as not registrable under that code; no text of the Journal officiel read defines it and the data does not give the reason). For Tunisia (country TN): reglementee when an authorisation of annex 1 of décret 2018-417 governs the class, libre otherwise (the annex is the exclusive list), not_determined when that map is not loaded."
2 tool updates
- Added
get_tax_code_article - Added
search_tax_code
2 tool updates
- Changed
list_communes1 field changed- added
Input schema / properties / dairaAdded value: +{ + "description": "Only the communes of this daïra (or Algiers circonscription administrative), by name, accents ignored.", + "maxLength": 60, + "type": "string" +}
- Added
list_dairas
3 tool updates
- Added
get_commune - Added
list_communes - Added
search_post_offices
3 tool updates
- Added
get_jo_act - Added
get_support_schemes - Added
search_jo_text
1 tool update
- Added
get_tax_calendar
1 tool update
- Added
get_vat_regimes
1 tool update
- Changed
calculate_casnos1 field changed- changed
Input schema / properties / minimum_wage_hourly / descriptionPrevious value: -"Morocco only (country MA), regime TRAVAILLEUR_NON_SALARIE: the legal hourly minimum wage of non-agricultural activities in dirhams, which the decrees do not state. With it the answer gives the forfait income in dirhams (multiplier times that wage times the yearly hours)."New value: +"Morocco only (country MA), regime TRAVAILLEUR_NON_SALARIE: the legal hourly minimum wage of non-agricultural activities in dirhams, which the decrees do not state. With it the answer gives the forfait income in dirhams (multiplier times that wage times the yearly hours) and the AMO and pension contributions on it."
4 tool updates
- Changed
calculate_casnos11 fields changed- added
Input schema / properties / annual_hoursAdded value: +{ + "description": "Morocco only (country MA): the normal yearly working time in hours used with minimum_wage_hourly; 2,288 (article 184 of the Labour Code, not read in the decrees) when left out.", + "maximum": 8760, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / categoryAdded value: +{ + "description": "Morocco only (country MA), regime TRAVAILLEUR_NON_SALARIE: the category of non-salaried worker, for example doctor, dentist, pharmacist, notary, architect, veterinarian, land_surveyor, judicial_bailiff, taxi_driver, professional_driver, farmer, trader_artisan_accounting, artisan_unaccounted, traditional_fishing_boat_owner, cpu. Leave it out to list the categories, each with its decree and its Bulletin officiel.", + "type": "string" +} - added
Input schema / properties / minimum_wage_hourlyAdded value: +{ + "description": "Morocco only (country MA), regime TRAVAILLEUR_NON_SALARIE: the legal hourly minimum wage of non-agricultural activities in dirhams, which the decrees do not state. With it the answer gives the forfait income in dirhams (multiplier times that wage times the yearly hours).", + "maximum": 10000, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / net_profitAdded value: +{ + "description": "Morocco only (country MA), category trader_artisan_accounting under the actual net result regime: the annual net profit in dirhams, which picks the tier (up to 100,000 dirhams or above).", + "maximum": 1000000000000, + "minimum": 0, + "type": "number" +} - changed
Input schema / properties / regime / descriptionPrevious value: -"Algeria: the tax regime of the person: FORFAITAIRE_ACHAT_VENTE (flat-rate regime, purchase and resale), FORFAITAIRE_PRESTATIONS (flat-rate regime, services), BENEFICE_REEL (actual-profit regime), AUTO_ENTREPRENEUR (the flat yearly option of the auto-entrepreneur status) or PREMIERE_ANNEE (first year of contribution, with no previous year to rely on). Tunisia (country TN): only INDEPENDANT_NON_AGRICOLE, the CNSS scheme of the self-employed workers of the non-agricultural sector, which also needs income_class."New value: +"Algeria: FORFAITAIRE_ACHAT_VENTE, FORFAITAIRE_PRESTATIONS (flat-rate regimes, resale and services), BENEFICE_REEL (actual profit), AUTO_ENTREPRENEUR (flat yearly option) or PREMIERE_ANNEE (first year). Tunisia (country TN): INDEPENDANT_NON_AGRICOLE, INDEPENDANT_AGRICOLE and ARMATEUR_PECHE_30T (ten classes, need income_class); PETIT_AGRICULTEUR, PETIT_ARMATEUR_PECHE and PECHEUR_INDEPENDANT (flat 7.5 % scheme of law 2002-32); ARTISAN (craftsmen of the same law, 7.5 % of 2/3 of the SMIG over 200 hours a month). Morocco (country MA): AUTO_ENTREPRENEUR (decree 2-21-928) or TRAVAILLEUR_NON_SALARIE (the other non-salaried workers: one decree per category, chosen with category)." - changed
Input schema / properties / regime / enumPrevious value: -[ - "FORFAITAIRE_ACHAT_VENTE", - "FORFAITAIRE_PRESTATIONS", - "BENEFICE_REEL", - "AUTO_ENTREPRENEUR", - "PREMIERE_ANNEE", - "INDEPENDANT_NON_AGRICOLE" -]New value: +[ + "FORFAITAIRE_ACHAT_VENTE", + "FORFAITAIRE_PRESTATIONS", + "BENEFICE_REEL", + "AUTO_ENTREPRENEUR", + "PREMIERE_ANNEE", + "INDEPENDANT_NON_AGRICOLE", + "INDEPENDANT_AGRICOLE", + "ARMATEUR_PECHE_30T", + "PETIT_AGRICULTEUR", + "PETIT_ARMATEUR_PECHE", + "PECHEUR_INDEPENDANT", + "ARTISAN", + "TRAVAILLEUR_NON_SALARIE" +] - changed
Input schema / properties / revenue / descriptionPrevious value: -"Yearly amount in Algerian dinars (DZD). For the flat-rate regimes send the turnover (chiffre d'affaires) of the previous year; for BENEFICE_REEL send the taxable profit. Needed for those three regimes, ignored for AUTO_ENTREPRENEUR and PREMIERE_ANNEE. Ignored for Tunisia (country TN), whose contribution depends on the income class."New value: +"Yearly amount in Algerian dinars (DZD). For the flat-rate regimes send the turnover (chiffre d'affaires) of the previous year; for BENEFICE_REEL send the taxable profit. Needed for those three regimes, ignored for AUTO_ENTREPRENEUR and PREMIERE_ANNEE. Ignored for Tunisia (country TN), whose contribution depends on the income class. For Morocco (country MA, regime AUTO_ENTREPRENEUR) it is required: the yearly amount, in Moroccan dirhams (MAD), of the \"droits annuels\" that select the bracket of the scale of the tax administration." - added
Input schema / properties / seniority_yearsAdded value: +{ + "description": "Morocco only (country MA): the seniority in years, which picks the tier of the categories whose forfait income depends on it (dentist, veterinarian, land_surveyor, architect). Complete years count.", + "maximum": 100, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / smig_monthly_tndAdded value: +{ + "description": "Tunisia only (country TN): the monthly guaranteed minimum wage (SMIG) in dinars, for the craftsmen of the law no. 2002-32 (regime ARTISAN of calculate_casnos, activity crafts of calculate_ifu): their contribution is 7.5 % of two thirds of its hourly value (monthly amount divided by 208 hours at 48 hours a week) over 200 hours a month. Leave it out to use the SMIG of décret 2026-67 (554.736 dinars, 48 hour week; see week_hours).", + "maximum": 100000, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / tierAdded value: +{ + "description": "Morocco only (country MA): the tier of the category when it has several (for example general or specialist for a doctor, owner or non_owner for a driver, class_1 to class_9 for a farmer, simplified for a trader under the simplified net result regime). The answer lists the tiers of the category.", + "type": "string" +} - added
Input schema / properties / week_hoursAdded value: +{ + "default": 48, + "description": "Tunisia only (country TN): the weekly working-time regime whose SMIG of décret 2026-67 the craftsmen's contribution uses when smig_monthly_tnd is left out: 48 (554.736 dinars a month, the default) or 40 (470.251). The CNSS page of the craftsmen uses the 48 hour regime, so leave it at 48.", + "enum": [ + 40, + 48 + ], + "type": "integer" +}
- Changed
calculate_ifu8 fields changed- changed
Input schema / properties / activity / descriptionPrevious value: -"Kind of activity: production (goods), commerce (resale in the same state) or services (including liberal professions). Required with the general regime, where it sets the rate; ignored with ae. Tunisia (country TN): required, and crafts means a craft or artisanal activity of the order of 23 July 2002, whose social part is not calculated. For Morocco (country MA) it is required with ae: production and commerce are taxed at 0.5 %, services at 1 %."New value: +"Kind of activity: production (goods), commerce (resale in the same state) or services (including liberal professions). Required with the general regime, where it sets the rate; ignored with ae. Tunisia (country TN): required, and crafts means a craft or artisanal activity of the order of 23 July 2002, whose social part is two thirds of the SMIG at 7.5 % (week_hours, smig_monthly_tnd). For Morocco (country MA) it is required with ae: production and commerce are taxed at 0.5 %, services at 1 %." - added
Input schema / properties / net_incomeAdded value: +{ + "description": "Tunisia only (country TN), required with regime general: the net taxable income in Tunisian dinars, after the deductions of the code. The scale of article 44 of the income tax code is applied to it; the turnover only serves the minimum tax.", + "maximum": 1000000000000, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / optionAdded value: +{ + "default": "standard", + "description": "Tunisia only (country TN), regime forfait: standard for the tariff of article 44 ter (400 dinars in a communal zone, 200 elsewhere, up to 10,000 dinars of turnover, then 3 %) or optional for the optional forfait tax of paragraph 1 (4,000 dinars up to 50,000 of turnover, 5,000 dinars up to 100,000).", + "enum": [ + "standard", + "optional" + ], + "type": "string" +} - changed
Input schema / properties / regime / descriptionPrevious value: -"ae for the auto-entrepreneur status (ANAE), general for the general IFU regime of the other micro-businesses."New value: +"ae for the auto-entrepreneur status (ANAE), general for the general IFU regime of the other micro-businesses. Tunisia (country TN): ae (single contribution), forfait (forfait tax of article 44 ter of the income tax code, with option and zone) or general (the income tax scale of article 44 applied to net_income)." - changed
Input schema / properties / regime / enumPrevious value: -[ - "ae", - "general" -]New value: +[ + "ae", + "general", + "forfait" +] - added
Input schema / properties / ruralAdded value: +{ + "description": "Tunisia only (country TN), regime forfait with option optional: true for a person working in the rural zones and the villages, who pays half the amount.", + "type": "boolean" +} - added
Input schema / properties / smig_monthly_tndAdded value: +{ + "description": "Tunisia only (country TN): the monthly guaranteed minimum wage (SMIG) in dinars, for the craftsmen of the law no. 2002-32 (regime ARTISAN of calculate_casnos, activity crafts of calculate_ifu): their contribution is 7.5 % of two thirds of its hourly value (monthly amount divided by 208 hours at 48 hours a week) over 200 hours a month. Leave it out to use the SMIG of décret 2026-67 (554.736 dinars, 48 hour week; see week_hours).", + "maximum": 100000, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / week_hoursAdded value: +{ + "default": 48, + "description": "Tunisia only (country TN): the weekly working-time regime whose SMIG of décret 2026-67 the craftsmen's contribution uses when smig_monthly_tnd is left out: 48 (554.736 dinars a month, the default) or 40 (470.251). The CNSS page of the craftsmen uses the 48 hour regime, so leave it at 48.", + "enum": [ + 40, + 48 + ], + "type": "integer" +}
- Changed
get_activity_code2 fields changed- changed
Input schema / properties / code / descriptionPrevious value: -"Activity code. Algeria: the CNRC code, six digits, for example 101101. Tunisia (country TN): the NAT 2009 class code, four digits, for example 0111 or 01.11. Morocco (country MA): the NMA 2010 activity code, four digits, for example 0111. Find codes with search_activity_codes."New value: +"Activity code. Algeria: the CNRC code, six digits, for example 101101. Tunisia (country TN): the NAT 2009 class code, four digits, for example 0111 or 01.11, or the code of an authorisation of décret 2018-417, A1-017 (annex 1) or A2-005 (annex 2), or one added by décret 2022-317 such as A1-019bis. Morocco (country MA): the NMA 2010 activity code, four digits, for example 0111. Find codes with search_activity_codes." - changed
Input schema / properties / code / patternPrevious value: -"^([0-9]{4}|[0-9]{6}|[0-9]{2}\\.[0-9]{2})$"New value: +"^([0-9]{4}|[0-9]{6}|[0-9]{2}\\.[0-9]{2}|[Aa][12]-[0-9]{1,3}([Bb][Ii][Ss])?)$"
- Changed
search_activity_codes2 fields changed- added
Input schema / properties / listAdded value: +{ + "default": "nat", + "description": "Tunisia only (country TN): nat (the default) searches the classes of the NAT 2009; authorisations searches the 100 authorisations of annex 1 (and the 27 of annex 2, those to be struck out) of décret gouvernemental n° 2018-417 of 11 May 2018, as records with their conditions, procedures, delays and legal references. Ignored for Algeria and Morocco. Get one with get_activity_code and a code such as A1-017.", + "enum": [ + "nat", + "authorisations" + ], + "type": "string" +} - changed
Input schema / properties / status / descriptionPrevious value: -"Keep only activities with this status: libre (free, no specific authorization needed to register), reglementee (regulated, a prior authorization or permit is required) or bloquee (blocked, cannot be registered in the trade register). For Tunisia (country TN) every code has the status not_determined, which is also accepted here: no official text read so far says which NAT codes are free or regulated."New value: +"Keep only activities with this status: libre (free, no specific authorization needed to register), reglementee (regulated, a prior authorization or permit is required) or bloquee (blocked, cannot be registered in the trade register). For Tunisia (country TN): reglementee when an authorisation of annex 1 of décret 2018-417 governs the class, libre otherwise (the annex is the exclusive list), not_determined when that map is not loaded."
18 tool updates
- Changed
calculate_casnos5 fields changed- changed
Input schema / properties / country / descriptionPrevious value: -"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have, returns country_not_available."New value: +"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required." - added
Input schema / properties / income_classAdded value: +{ + "description": "Tunisia only (country TN): the income class of the insured person in the CNSS scale of the self-employed, from 1 (the lowest base) to 10. Required with the regime INDEPENDANT_NON_AGRICOLE; the answer lists the ten classes. Ignored for Algeria.", + "maximum": 10, + "minimum": 1, + "type": "integer" +} - changed
Input schema / properties / regime / descriptionPrevious value: -"Tax regime of the person: FORFAITAIRE_ACHAT_VENTE (flat-rate regime, purchase and resale), FORFAITAIRE_PRESTATIONS (flat-rate regime, services), BENEFICE_REEL (actual-profit regime), AUTO_ENTREPRENEUR (the flat yearly option of the auto-entrepreneur status) or PREMIERE_ANNEE (first year of contribution, with no previous year to rely on)."New value: +"Algeria: the tax regime of the person: FORFAITAIRE_ACHAT_VENTE (flat-rate regime, purchase and resale), FORFAITAIRE_PRESTATIONS (flat-rate regime, services), BENEFICE_REEL (actual-profit regime), AUTO_ENTREPRENEUR (the flat yearly option of the auto-entrepreneur status) or PREMIERE_ANNEE (first year of contribution, with no previous year to rely on). Tunisia (country TN): only INDEPENDANT_NON_AGRICOLE, the CNSS scheme of the self-employed workers of the non-agricultural sector, which also needs income_class." - changed
Input schema / properties / regime / enumPrevious value: -[ - "FORFAITAIRE_ACHAT_VENTE", - "FORFAITAIRE_PRESTATIONS", - "BENEFICE_REEL", - "AUTO_ENTREPRENEUR", - "PREMIERE_ANNEE" -]New value: +[ + "FORFAITAIRE_ACHAT_VENTE", + "FORFAITAIRE_PRESTATIONS", + "BENEFICE_REEL", + "AUTO_ENTREPRENEUR", + "PREMIERE_ANNEE", + "INDEPENDANT_NON_AGRICOLE" +] - changed
Input schema / properties / revenue / descriptionPrevious value: -"Yearly amount in Algerian dinars (DZD). For the flat-rate regimes send the turnover (chiffre d'affaires) of the previous year; for BENEFICE_REEL send the taxable profit. Needed for those three regimes, ignored for AUTO_ENTREPRENEUR and PREMIERE_ANNEE."New value: +"Yearly amount in Algerian dinars (DZD). For the flat-rate regimes send the turnover (chiffre d'affaires) of the previous year; for BENEFICE_REEL send the taxable profit. Needed for those three regimes, ignored for AUTO_ENTREPRENEUR and PREMIERE_ANNEE. Ignored for Tunisia (country TN), whose contribution depends on the income class."
- Changed
calculate_ifu5 fields changed- changed
Input schema / properties / activity / descriptionPrevious value: -"Kind of activity: production (goods), commerce (resale in the same state) or services (including liberal professions). Required with the general regime, where it sets the rate; ignored with ae."New value: +"Kind of activity: production (goods), commerce (resale in the same state) or services (including liberal professions). Required with the general regime, where it sets the rate; ignored with ae. Tunisia (country TN): required, and crafts means a craft or artisanal activity of the order of 23 July 2002, whose social part is not calculated. For Morocco (country MA) it is required with ae: production and commerce are taxed at 0.5 %, services at 1 %." - changed
Input schema / properties / activity / enumPrevious value: -[ - "production", - "commerce", - "services" -]New value: +[ + "production", + "commerce", + "services", + "crafts" +] - changed
Input schema / properties / country / descriptionPrevious value: -"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have, returns country_not_available."New value: +"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required." - changed
Input schema / properties / turnover / descriptionPrevious value: -"Yearly turnover (chiffre d'affaires) in Algerian dinars (DZD)."New value: +"Yearly turnover (chiffre d'affaires) in Algerian dinars (DZD), or in Moroccan dirhams (MAD) for country MA." - added
Input schema / properties / zoneAdded value: +{ + "description": "Tunisia only (country TN), required: communal for a person working in a communal zone, within the limits of the communes before 1 January 2015 (200 dinars of income tax a year), other for any other zone (100 dinars). Ignored for Algeria.", + "enum": [ + "communal", + "other" + ], + "type": "string" +}
- Changed
creation_legal_forms1 field changed- changed
Input schema / properties / country / descriptionPrevious value: -"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have, returns country_not_available."New value: +"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required."
- Changed
customs_tariff_chapters1 field changed- changed
Input schema / properties / country / descriptionPrevious value: -"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have, returns country_not_available."New value: +"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required."
- Changed
customs_tariff_sections1 field changed- changed
Input schema / properties / country / descriptionPrevious value: -"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have, returns country_not_available."New value: +"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required."
- Changed
get_activity_code3 fields changed- changed
Input schema / properties / code / descriptionPrevious value: -"CNRC activity code, six digits, for example 101101. Find codes with search_activity_codes."New value: +"Activity code. Algeria: the CNRC code, six digits, for example 101101. Tunisia (country TN): the NAT 2009 class code, four digits, for example 0111 or 01.11. Morocco (country MA): the NMA 2010 activity code, four digits, for example 0111. Find codes with search_activity_codes." - changed
Input schema / properties / code / patternPrevious value: -"^[0-9]{6}$"New value: +"^([0-9]{4}|[0-9]{6}|[0-9]{2}\\.[0-9]{2})$" - changed
Input schema / properties / country / descriptionPrevious value: -"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have, returns country_not_available."New value: +"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required."
- Changed
get_anae_activity3 fields changed- changed
Input schema / properties / code / descriptionPrevious value: -"ANAE activity code, six digits, for example 010101. Find codes with search_anae_activities."New value: +"ANAE activity code, six digits, for example 010101. For Morocco (country MA) it is the key of an excluded profession, for example avocats, or regime. Find codes with search_anae_activities. For Tunisia (country TN) it is the key of the regime record: regime (statut and ae are accepted too); Tunisia has no activity codes." - changed
Input schema / properties / code / patternPrevious value: -"^[0-9]{6}$"New value: +"^([0-9]{6}|[A-Za-z0-9][A-Za-z0-9_-]{1,99})$" - changed
Input schema / properties / country / descriptionPrevious value: -"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have, returns country_not_available."New value: +"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required."
- Changed
get_jo_issue2 fields changed- changed
Input schema / properties / country / descriptionPrevious value: -"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have, returns country_not_available."New value: +"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required." - changed
Input schema / properties / year / descriptionPrevious value: -"Year of the gazette: the Journal Officiel from 1962 for Algeria, the Bulletin officiel from 1912 for Morocco (country MA), the Journal Officiel de la République Tunisienne from 1956 for Tunisia (country TN). Find the years covered with list_jo_years."New value: +"Year of the gazette: the Journal Officiel from 1962 for Algeria, the Bulletin officiel from 1912 for Morocco (country MA), the Journal Officiel de la République Tunisienne from 1956 for Tunisia (country TN). Find the years covered with list_jo_years. Without an API key only Algeria answers, for the current year and the two before it."
- Changed
get_social_contributions1 field changed- changed
Input schema / properties / country / descriptionPrevious value: -"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have, returns country_not_available."New value: +"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required."
- Changed
get_tax_rates1 field changed- changed
Input schema / properties / country / descriptionPrevious value: -"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have, returns country_not_available."New value: +"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required."
- Changed
get_wilaya1 field changed- changed
Input schema / properties / country / descriptionPrevious value: -"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have, returns country_not_available."New value: +"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required."
- Changed
list_institutions1 field changed- changed
Input schema / properties / country / descriptionPrevious value: -"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have, returns country_not_available."New value: +"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required."
- Changed
list_jo_issues2 fields changed- changed
Input schema / properties / country / descriptionPrevious value: -"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have, returns country_not_available."New value: +"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required." - changed
Input schema / properties / year / descriptionPrevious value: -"Year of the gazette: the Journal Officiel from 1962 for Algeria, the Bulletin officiel from 1912 for Morocco (country MA), the Journal Officiel de la République Tunisienne from 1956 for Tunisia (country TN). Find the years covered with list_jo_years."New value: +"Year of the gazette: the Journal Officiel from 1962 for Algeria, the Bulletin officiel from 1912 for Morocco (country MA), the Journal Officiel de la République Tunisienne from 1956 for Tunisia (country TN). Find the years covered with list_jo_years. Without an API key only Algeria answers, for the current year and the two before it."
- Changed
list_jo_years1 field changed- changed
Input schema / properties / country / descriptionPrevious value: -"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have, returns country_not_available."New value: +"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required."
- Changed
list_wilayas1 field changed- changed
Input schema / properties / country / descriptionPrevious value: -"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have, returns country_not_available."New value: +"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required."
- Changed
search_activity_codes7 fields changed- changed
Input schema / properties / country / descriptionPrevious value: -"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have, returns country_not_available."New value: +"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required." - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of results in the page, from 1 to 100. Defaults to 20."New value: +"Maximum number of results in the page, from 1 to 100. Defaults to 20. Without an API key at most 10 rows come back." - changed
Input schema / properties / offset / descriptionPrevious value: -"Number of results to skip, from 0 to 10000, to read the next pages. Defaults to 0. meta.total tells how many results match."New value: +"Number of results to skip, from 0 to 10000, to read the next pages. Defaults to 0. meta.total tells how many results match. Without an API key it must be 0: a search cannot be paged." - changed
Input schema / properties / sector / descriptionPrevious value: -"Keep only activities of this CNRC sector, given as its digit: 1 goods production, 2 artisanal production, 3 wholesale distribution, 4 import for resale, 5 retail distribution, 6 services, 7 export."New value: +"Keep only activities of this sector. Algeria: the CNRC sector, given as its digit: 1 goods production, 2 artisanal production, 3 wholesale distribution, 4 import for resale, 5 retail distribution, 6 services, 7 export. Tunisia (country TN): the section letter of the NAT 2009, A to U, for example C for manufacturing. For Morocco (country MA): the section of the NMA 2010 as its letter, A to U (for example C for manufacturing, G for trade)." - changed
Input schema / properties / sector / enumPrevious value: -[ - "1", - "2", - "3", - "4", - "5", - "6", - "7" -]New value: +[ + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U" +] - changed
Input schema / properties / status / descriptionPrevious value: -"Keep only activities with this status: libre (free, no specific authorization needed to register), reglementee (regulated, a prior authorization or permit is required) or bloquee (blocked, cannot be registered in the trade register)."New value: +"Keep only activities with this status: libre (free, no specific authorization needed to register), reglementee (regulated, a prior authorization or permit is required) or bloquee (blocked, cannot be registered in the trade register). For Tunisia (country TN) every code has the status not_determined, which is also accepted here: no official text read so far says which NAT codes are free or regulated." - changed
Input schema / properties / status / enumPrevious value: -[ - "libre", - "reglementee", - "bloquee" -]New value: +[ + "libre", + "reglementee", + "bloquee", + "not_determined" +]
- Changed
search_anae_activities4 fields changed- changed
Input schema / properties / country / descriptionPrevious value: -"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have, returns country_not_available."New value: +"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required." - changed
Input schema / properties / domain / descriptionPrevious value: -"Keep only activities of this ANAE domain, given by its six-digit domain code (it ends in 0000), for example 010000 for Advice, Expertise and Training. Every result carries its domain."New value: +"Keep only activities of this ANAE domain, given by its six-digit domain code (it ends in 0000), for example 010000 for Advice, Expertise and Training. Every result carries its domain. Not used for Tunisia (country TN): it has one regime record and no domains." - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of results in the page, from 1 to 100. Defaults to 20."New value: +"Maximum number of results in the page, from 1 to 100. Defaults to 20. Without an API key at most 10 rows come back." - changed
Input schema / properties / offset / descriptionPrevious value: -"Number of results to skip, from 0 to 10000, to read the next pages. Defaults to 0. meta.total tells how many results match."New value: +"Number of results to skip, from 0 to 10000, to read the next pages. Defaults to 0. meta.total tells how many results match. Without an API key it must be 0: a search cannot be paged."
- Changed
search_jo_titles4 fields changed- changed
Input schema / properties / country / descriptionPrevious value: -"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have, returns country_not_available."New value: +"Country of the data, an ISO 3166-1 alpha-2 code in any letter case: DZ for Algeria, the default, TN for Tunisia or MA for Morocco. Only live countries answer: list_countries shows them and their datasets. Any other country, or a dataset the country does not have (for example the activity nomenclature for Morocco), returns country_not_available. Without an API key only DZ answers: TN and MA return key_required." - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of results in the page, from 1 to 100. Defaults to 20."New value: +"Maximum number of results in the page, from 1 to 100. Defaults to 20. Without an API key at most 10 rows come back." - changed
Input schema / properties / offset / descriptionPrevious value: -"Number of results to skip, from 0 to 10000, to read the next pages. Defaults to 0. meta.total tells how many results match."New value: +"Number of results to skip, from 0 to 10000, to read the next pages. Defaults to 0. meta.total tells how many results match. Without an API key it must be 0: a search cannot be paged." - changed
Input schema / properties / year / descriptionPrevious value: -"Search only the issues of this year (1962 or later). Leave it out to search every year."New value: +"Search only the issues of this year (1962 or later). Leave it out to search every year. Without an API key only the current year and the two before it can be searched."
Related MCP Connectors
Company search and enrichment from official business registers in 200+ countries.
European business data — French company check, EU VAT validation, legal search.
French company data from public registers (Sirene, RNE, BODACC) and French legal notices.
Official company data from 66 business registers: search, VAT/EORI/LEI, UBO, sanctions.
Related MCP Servers
- AlicenseAqualityCmaintenanceStructured business intelligence for AI agents. 11.3M verified entities, 40.3M BORME mercantile acts, EU VAT validation (VIES), GLEIF LEI and healthcare registries. 12 tools.61MIT
- AlicenseNot gradedqualityCmaintenanceProvides AI assistants with accurate Algerian administrative data, including wilayas, communes, postal codes, and phone validation, as well as e-commerce, credential verification, and training tools.12 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables searching and retrieving French official business-event notices (creations, insolvency, sales, modifications, etc.) for companies by SIREN or name, with filtering by event type, department, and date range, all via keyless access.412 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables official-source lookups on people and companies, covering registration status, tax and labor clearance certificates, sanctions lists, trademarks/patents, and electronic invoices, with platform-hosted pay-per-query access.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.