alexander-pick / MKMTool

MKMTool ist a helper application I wrote for tinkering around with optimization of sale processes on magiccardmarket.eu and the idea of automisation of some tasks most people wouldn’t be able to get done by pure manpower.
GNU Affero General Public License v3.0
72 stars 14 forks source link

Welcome to MKMTool 0.8

IF YOU ARE UPDATING FROM A VERSION OLDER THAN:

Latest changes

Version 0.8.2.2, 21.1.2024

Version 0.8.2.1, 28.11.2023

Version 0.8.2.0, 30.3.2021 Note: releasing on 29.9.2021, while API is still not fully functional. The new features were tested back in March on a professional account, it is unclear if and how they will work further on.

Version 0.8.1.0, 22.2.2021

Version 0.8.0.4, 22.1.2021

Version 0.8.0.3, 13.1.2021

Version 0.8.0.2, 17.12.2020

Version 0.8.0.1, 8.12.2020

Version 0.8.0.0, 8.12.2020

New/improved features:

Bug-fixes:

Show older changelogs

**Version 0.7.0.5, 12.12.2019** + Fix Download buys outputting all the orders N times, where N was number of orders + Card and expansion name for singles in Download buys is now exported in English **Version 0.7.0.4, 19.10.2019** + Using the myStock.csv when pricing external list is now possible (there is a checkbox, default off). Also, if list contains the Min Price column, that price will also be used as minimal price (same rules apply as when using myStock.csv). + Fixed failed price updates when the price was computed to less than 0.02€ - MKM requires 2 cents as minimum -> if a lower price is computed, it is set to 0.02€ + Fixed failed article updates when comments included characters that are special in XML (&, <, > etc.) -> the special characters can now be used + Language, Localized Name and Rarity have been added to the inventory viewer **Version 0.7.0.3, 22.8.2019** + Fixed the "export only appraised" in Price External List to (hopefully) work correctly + In Price External List, when identifying cards based on their locName, full match is required now. Only products whose foreign name match exactly what is in the list will be considered as those cards. Before, many cards were falsely flagged as "multiple results for this card name", because of misc products like sleeves etc. with the same name as the card. + In Price External List, foreign name can now be any case (just as the English names) **Version 0.7.0.2, 20.8.2019** + Fixed update price crashing when it encounters single cards from non-MTG games. Now they will be processed as well - but not all features are guaranteed to work for non-MTG. **Version 0.7.0.1, 13.7.2019** + When reading a card from CSV and product ID, expansion ID or expansion name is not recognized, a warning will be displayed. + Some more clarifications on limitations of Price External List **Version 0.7.0, 11.7.2019 (by [Tomas Janak](https://github.com/tomasjanak))** Bug-fixes: + Fixed [Check Display Value](#Check-Display-Value) using locale-dependent number parsing, which caused the decimal delimiter to be ignored if you are using '.' instead of ',', leading to 100x higher prices. + Fixed numerous issues in [Check for Cheap Deals](#Check-for-Cheap-Deals), now it works as intended for all three modes (expansion check, user check, want list check) + Error logging is now more consistent, you can find all errors in the error_log.txt, separated for each individual run of MKMTool and with more precise description + Local database is updated after pressing the update button even when the files already exist on hard drive + Want list editor now also displays "metaproducts", that is cards for which you have set the expansion to "any" (it will show "\" in the expansion name column). In line with that, it will no longer crash if you open a want list that has only metaproducts. + Fixed behaviour of the delete function in Want List editor: when no line is selected, message is displayed; when multiple lines are selected, all of the selected items are deleted. + Fixed a minor bug in update price when using worldwide search: if the condition setting "Accept better only if there is at least one more expensive match" was turned on and it would cause not enough cards to be found among domestic items, the worldwide search would not happen, now it does. New/improved features: + Added a new module "Price External List" - allows to generate new prices to a list of card loaded from a CSV file and then export it or directly put on sale to MKM. See [documentation](#Price-External-List) below. + The main window can now be enlarged + All "module" windows (Check Cheap Deals, Check Display Value etc.) now no longer block the main window, so you can scroll through the log while the module is opened. Clicking the module window while its window is open will close the window. Data that rely on your MKM profile are reloaded every time you re-open the window, but "local" settings (i.e. checkboxes you checked etc.) now persist when you close and re-open the window. + The number of API calls you sent to MKM is now displayed on the bottom of the window along the maximum number of calls you are allowed. When the limit is reached, MKMTool will no longer send any requests to MKM until you restart MKMTool or new day has passed (MKM resets the counter on 0:00 CET). The number of calls comes directly from MKM (they send it with each call), so it is 100% reliable. When you have only 50 calls remaining, the text will turn red to warn you. + Reworked GUI for [Check for Cheap Deals](#Check-for-Cheap-Deals). Also, for user check you can now filter only cards from the specified expansion rather than checking all cards of the user + Added the option to use different price factor for the average price when worldwide search is used for price update (there is a separate slider for it now) + Added the option to add markup on estimated price when you have multiple copies of a given card (see [documentation](#Price-Update) below) + Added the option to "ignore" the playset flag when updating prices - when turned on, all articles marked as playset will be treated as 4x single card + Separated "log non-updated if price change too large" log option into two - you can now select if you want to log these non-updates only when your price is higher or only when it is lower (also fixed it as the non-updates due to high variance was actually checked when this one should have been checked, so the this checkbox wasn't doing anything). Note that this is not backwards compatible with previous presets - when you load your own preset, you need to check the logging options you like and save it again. + Added the option to load a list of cards with minimal prices that the [Price Update](#Price-Update) module uses to not go below specified prices for any card you want (see details in the [documentation](#Price-Update) below) + Added the option to export your entire inventory to CSV file from the [View Inventory](#View-Inventory) screen. **9.2.2019 (by [Tomas Janak](https://github.com/tomasjanak))** + Fixed "Bad Request 400" error when working with more than 100 items (partially by [Ramiro Aparicio](https://github.com/friscoMad)) after API changes announced on 6.2.2019 + Mint condition is treated as Near Mint when looking for similar items + Added an option to search for similar items worldwide (ignoring your country) if there aren't enough similar items in your country + Fixed a bug causing in some cases the last added item to not be considered as matching condition even when it was + Comments are no longer removed from the article upon update + Added a "check for cheap deals from user" option **27.01.2018 (by [Tomas Janak](https://github.com/tomasjanak))** + Added customizable settings for Update Price (see documentation below) + Price update no longer uses your own items when calculating the price + Richer log options **11.07.2017** + Fixed weird bug which caused wrong price calculation on foreign systems + Fixed crash if articles other than singles are listed on the account **24.04.2017** + Made GUI respond during article update + Error Log improved **08.04.2017** + changed the default minutes for the bot **23.02.2017** + country is no longer hard-coded and now determined at startup from your account details + code was cleaned up **22.02.2017** + bug preventing the startup was fixed

What is this?

MKMTool is a helper application I wrote for tinkering around with optimization of sale processes on magiccardmarket.eu and the idea of automation of some tasks most people wouldn’t be able to get done by pure manpower.

This tool is intended for everyone who is curious about buying and selling MTG cards with more comfort. But needs some (minimum) technical skill at the current state.

First a small disclaimer and things to remember:

Installation and starting off

The preferred way is to compile MKMTool yourself, which is easier than it sounds. Download the code (green button in upper left corner on the main page) and unzip. Open MKMTool.sln in Microsoft Visual Studio Community 2015 or newer (free for private use, download URL see at the end of this file) and compile/run it, i.e. press the green Start button in top middle, or press F5 (see the discussion here for some common issues: https://github.com/alexander-pick/MKMTool/issues/33#issuecomment-621855056).

If you do not want to do that, here is a build for Windows (64-bit):

https://github.com/tomasjanak/tomasjanak.github.io/blob/master/MKMTool0.8.2.2.zip, compiled by Tomas Janak). IF YOU ARE UPDATING FROM A VERSION OLDER THAN 1.12.2020, delete mkminventory.csv file in your bin folder before starting MKMTool. But from now on, try to always keep this file even as you update to new versions, it will store additional data about cards in your stock so that MKMTool can use less API requests and be faster.

Before you can use the tool please rename config_template.xml to config.xml and add the apptoken details you can generate in your magiccardmarket profile: on the cardmarket website, click Account -> API Settings and generate tokens for "Dedicated App" (you can put anything you want as the app name). You need an account which is able to sell to use most of the seller functions. Once you generate it, four random strings of letters and numbers will appear there, copy-pasete those to your config.xml (see how-to run below for details).

Short how-to run

The first startup takes a bit since 3 MB of data is downloaded and unzipped, but there should be no problem on Win7 or 10 beyond this.

Ok - ok, but what can MKMTool do?

Main Window

MKMTool has several features/modules, click the links to bring you to documentation for the particular feature below:

Currency: MKMTool uses the currency of your account for all pricing and computation. Any numbers and settings you use that reference currency are in your account's currency.

Settings

But first, let's see settings you can choose in the config.xml file (values are entered without quotes):

Price Update

This function will update all your card sale prices, all you need to do is press the Update Price button. The basic idea is to match your prices to the cheapest prices from your country (to avoid dealing with different shipping costs). However, there are numerous parameters that can change how exactly is this price computed, accessible through the "Settings" button on the bottom of the window - it is recommended to look at those first before your first run. The implemented algorithm will now be described, but if it is not good enough for you and you can write some C# code, you can modify the MKMBot class directly (look for MKMBot.UpdatePrices() method).

The base algorithm is called "TOSS" - Traversal of Other Seller's Stock. It is based on analyzing "similar items" being sold. This is a sequence of cards sold by other MKM users in the same country as you that are the same as the one you are trying to sell. "The same" means they have the same name, expansion, foil/nonfoil, signed/altered and playset/single statuses. Condition is always either the same or better and will be discussed later. Once the sequence is determined, the price is computed based either on the average or on the lowest or highest prices from the sequence. The sequence is always ordered from the cheapest items up. If the algorithm at some points finds out that it does not need another similar item, it stops reading them and just the ones found so far are used to compute the price. Hence the prices will always be a bit skewed towards the cheaper offers.

If you have a commercial account (professional or powerseller), you can also use price guides instead of / in combination with TOSS (the API does not provide the necessary request to non-commercial sellers, not MKMTool's fault).

When Update Price is running (not in bot mode) you can stop it by pressing the update price button again. MKMTool will finish processing the current article (can take a few seconds if it is waiting on some API request) and then send to Cardmarket the articles that were already computed but not yet sent (normally MKMTool sends them in batches of 100).

MKMTool remembers the number of the last updated (sent to Cardmarket) article. If price update finishes prematurely (closing MKMTool or stopping price update), next time you run Price Update a message box will ask you if you want to continue from the last time or restart. Note that if your stock has changed significantly, some articles can be missed if you continue: MKMTool remembers simply how many articles were processed, not which ones.

The following figure shows the settings window. Each of the parameters will now be described in details, going from top to bottom, left to right:

Update Price Settings

General settings

TOSS settings

Price guide settings

Log settings

Misc settings

There is also a Bot mode, you can make the tool execute this task every X minutes. The preset is 360 minutes = 6 hours. Keep your API Limit in mind, the tool needs to request the product data for every article you own to calculate the price, 1 call per item is needed.

You must feel comfortable with the formula or change it to your demands, be aware that making mistakes in price calculation can cost you real money. Handle with care.

MyStock

You can also define a list of minimum prices for which you want to be selling certain cards. For those cards, the Price Update will not give them lower then specified price no matter what the algorithm computes. This can be useful if you for example want to make sure you are not selling certain cards for less than you bought them for, or if you have certain cards you don't really want to sell unless for a high enough price. The list is defined as follows:

Create a CSV (comma separated values) file in the same folder as your binary is, i.e. alongside your config file, called "myStock.csv" (case sensitive). See CSV card lists in MKMTool for details about format. You do not need to do anything else to turn the feature on - if the file is present, it will be used (you will also see a message in the log window that the list has been found), if not, the update will still be done without it. After MKMTool computes the price for a particular article, it checks if there is an entry in myStock.csv that matches all attributes of that card and if so, the computed price is compared with the MinPrice in the list and if it is lower, the MinPrice is assigned to the item instead. You do not have to use all the attributes. In fact, for the purpose of price update, the only required attribute is the MinPrice itself (if a row in the list does not have it filled, it will be ignored), everything else is optional. When a certain attribute is not filled in for a particular card in the list, it is assumed that you do not care about its value and therefore any article will be considered a match according to that particular attribute. Therefore, each entry in the list does not need to represent a particular card, it can be just sort of a template for a card, a "metacard". In the extreme case, you can have just the MinPrice and nothing else. Such metacard will always match with any card so you can use such metacard to set a minimum price for any card in your stock. Note - MKMTool "groups" (hashes) the metacards by the card name, so only metacards that have a matching name are actually tested for a the card that is being updated + all metacards that have no name assigned. So you don't have to be worried that adding a lot of articles in the list would significantly slow MKMTool down. Note: there is a setting that allows you to match with only the most detailed entries in the list, see Price Update, setting "MinPrice Match". The following example assumes it is set to "Highest" (default).

For example, assume your myStock.csv looks like this:

Name Expansion Condition Foil MinCondition MinPrice
Lightning Bolt false GD 2
Lightning Bolt Beta 200
Lightning Bolt Magic 2011 NM true 10
Beta 20

What does this say? It says you have a lot of Lightning Bolts on sale, you don't want to sell them for less than 2€ unless they are in a less then Good condition, you also have some from Beta, which are much more expensive and also one (or maybe more) foil from M11. Additionally, you have a bunch of other Beta cards and while you didn't want to bother writing all of them down, you are sure that even the worst Beta card is worth at least 20€. Now let's see what happens when you start updating the price of your cards.

First, let's say we are updating price for Jace, the Mind Sculptor from Worldwake. Our first three metacards are for Lightning Bolt, so that does not match. For the fourth rule, the name matches (because we do not care about it), but the second attribute is Beta and that does not match Worldwake, so we have no matching metacard for our Jace and his price will be assigned without any safety net.

Next let's say we have a near mint Lightning Bolt from M11. MKMTool computes 1.8€ for it and we go to metacard matching. For the first one, it matches the name, it is not foil and the condition is better than GD - so we have a match for everything. We compare the minimal price and see that it is higher than the computed price, so for now we set the price to 2€, but we still have to compare all the other metacards. The next one have a matching name, but not Expansion, so that's a pass. The next matches in name, expansion and condition, but not the Foil attribute, so it will also not be used. Lastly, the last metacard will not match by expansion. We will put our Bolt on sale for 2€.

Next article we have is a Lightly Played Lightning Bolt from Beta. MKMTool computed 186€ as its price. The first metacard will not be matched, because the condition is not good enough, but the next one will be - the Name matches, the Expansion matches and there is nothing else to check. The minimum price is higher, so we bump up the price to 200€. The third metacard does not match by many attributes, but the last one does as the only attribute is Expansion and it is Beta. However, 20 is less then 200 so after comparing the prices we will keep our 200€ price tag and that is what we upload on MKM in the end.

You can also define a PrescribedPrice column. If the best matching template for the appraised card has a PrescribedPrice, it will be used over the TOSS or Price Guide algorithm. The markup for multiple copies will still be applied and the max price change and MinPrice will be respected. Only the best matching template is used. For example, if there are two matching templates for a given card and only one has a Prescribed Price, it needs to have a total number of filled in columns higher than the other template. If it does not, Prescribed Price will not be used since the best matching template does not have it. Note that the prescribed price itself counts when computing the number of filled-in columns.

Price as formula

Both the MinPrice and PrescribedPrice can be defined as a formula comprising of any number of operands separated by operators. The operands must be either numbers or price guide codes. The operators can be only * for multiplication, + for addition or - for subtraction. Parenthesis are not supported. Because of that, the operations are evaluated in the order written, they do not respect common arithmetic rules. I.e. TREND+0.5*1.2 for a card with TREND value 10€ will evaluate to (10+0.5)1.2 = 12.6€ (not 10+(0.51.2)=10.6€ as you would normally expect). This somewhat limits how they can be used, but you can still do for example TREND+AVG7*0.5 to compute the average of TREND and 7 day average.

Check for Cheap Deals

Check Cheap Deals

For the fun of it – with this feature you can find cheap deals with X percent cheaper (the first parameter, see figure above) than other vendors and cheaper than the Trend if selected. You can specify a shipping addition to be added to the lowest found price to ensure a good deal. If cards are found they are directly added to your cart on MKM, just log in and check your cart. Use the parameters on the right side of the window to specify what kind of cards you are looking for and how it should be priced. There are three ways to check cheap deals:

Check Display Value

screenshot

This is more of an experimental feature, I written it to roughly calculate the expected ROI (return of invest) of a display/box compared to current “real time” MKM SELL prices. Math is a bit clumsy but should be correct, I am always open for improvements to this. I learned that most data published on various sites tends to be rather old or trashy, this gives me a nice view on the “real” site of things. The ROI is shitty, but I still love buying Boxes.

Price External List

Price External List

This module allows you to set a price not for cards you already have on sale on MKM, but rather any list of cards you have. The aim is to provide as robust interface as possible: the format of the input file must follow the CSV rules described in CSV card lists in MKMTool, but what attributes you have set for your cards in that list is up to you. The module can work with as little as only the name and still give you a reasonable price estimate. Of course, the more details you include (expansions, languages, conditions etc.), the more realistic prices you will get. Once the list is appraised, you can either save it as a CSV file again, or directly put it up for sale on MKM.

As you can see in the screenshot above, the whole process is divided into three sections going top to bottom: Import, Appraise and Export. We will now describe in details what you can do in each of those parts.

Import: In order to be able to appraise a card, we have to be able to determine its product ID. The product ID is MKM's internal identification number which is unique for each card from a particular expansion. Cards for which MKMTool is not able to determine this will not be appraised, but they will still be kept internally so that they can be later exported alongside your appraised items (see more in the Export section). The following list shows all possible options to determine the ID based on which card attributes are included in your CSV file.

  1. Include idProduct: the most straightforward way. If the product ID is set for the item, the English name and expansion will be fetched from MKMTool's database (which is automatically updated to include all Magic: the Gathering cards) as well. Of course, in most cases, you will not know what the ID is...
  2. Include Name and Expansion: this is doing it the other way around - based on the name and expansion, we can fetch the product ID from our database as well. However, there are several special cases where a certain card exists multiple times in one expansion. Most commonly it is basic lands, which have several versions, but there are other examples here and there (guildgates in Guild of Ravnica, general cards in some Commander products etc.). In those cases, MKMTool will try to use Card Number if you have specified it in the list. If you do, MKMTool will request the product info from MKM API and will select the correct card. You can find the Card Number on the bottom of the card - but only for newer cards. This means that for example old (Tempest block and older) basic lands are simply not possible to identify and you will either have to somehow provide product ID for them or price them manually. Still, this will not work on some cards anyway. For example, general cards from Commander products have two versions, oversized and normal, and each have the same Card Number. One little hack you can do if you do not know which version it is you have, but you also do not care / think they are all similar price, you can look into mkminventory.csv stored in MKMTool's directory. It includes all magic singles - search for yours (from the appropriate expansion) and choose one of the product IDs you find there at random.
  3. Include LocName, Expansion and Language or LanguageID: if you have the non-English name, we can find the product ID as well, but in this case it is necessary to know what the language is. Moreover, non-English names are not stored in MKMTool's local database, so for each item for which we have to use this method, we need to make one API request.

These methods will be used in the order written, i.e. if the data is successfully determined in one way, the later methods are not used and the name, expansion and product ID are all set based on the result of this method. This means that if you for example have idProduct set for a given item, the name and expansion will be fetched from MKMTool's database and whatever you might have entered in the Name column will be ignored, so it might even be the wrong name (e.g. with a typo) and appraisal will work. But this works the other way around as well - if you enter a wrong product ID, the card will not be processed even if you also entered (correct) name and expansion.

While the 2. and 3. method used expansion and Language, you do not actually necessary need them. As you can notice on the screenshot above, the first part of the GUI contains several combo-boxes for assuming attributes of the card when they are not known. This means that if a given attribute is empty in your list, the specified "default" value will be set for that card:

Whenever importing some item fails, you will get a message with line number of the card that failed to import. If you check the "Log all imported articles" checkbox, you will get a message about the successfully imported ones as well.

After you click the Import CSV file..., a file dialog will appear for you to choose the list to import. Once completed, the Appraise and Export buttons will become available.

Appraise: Once you have imported a list, you can set a price to each (successfully imported) article in it using the Appraise button. Using the two checkboxes above it you can select which price should be computed:

Export: There are two options for export, to CSV and "upload to MKM", which means the appraised articles will be put on sale on your MKM profile. Before describing the details of the two methods, note that you technically do not need to do appraisal in order to be able to do export. For example, you can import a list which already has pre-filled column with prices and directly upload it to MKM. Or maybe you have a list of card names in non-English language and you just want to translate them to English, you can import and then immediately export with all the extra information that was generated during import.

Export to CSV is very simple, you just press the button, choose a file to overwrite or a new one and the list will be saved. All the columns that were in the imported file will be kept and in the same order. If you want to export the generated prices (which you probably do), check the "MKMTool prices" and/or "MKM price guide prices". This will add columns with the selected additional attributes. If you check the "Include all known info", every attribute that was generated during the process will be written out - product ID, language ID, all the boolean flags etc.

There are several online services that allow you to track your collection. As of version 0.7., MKMTool is able to export (and import) data in a format compatible with one of such sites - www.deckbox.org. However, since there are some differences between formats, you have to check the "Force deckbox.org format" if you want the exported list to be directly upload-able to deckbox.org. Specifically, the Foil, Signed, Altered and Condition will have different values (see CSV card lists in MKMTool for more details, especially for Condition as that includes some assumptions about how are the MKM conditions translated into the ones used by deckbox.org). Also, if you use the "Include all known info", you will have to delete some columns as deckbox.org will see them as duplicated: you might end up with having both "Expansion" and "Edition" (delete any one of them), delete LanguageID (for some reason deckbox.org sees it the same as Language) and maybe others, the deckbox' web interface will tell you which columns are duplicated. However, MKM and deckbox.org use different names for some expansions, notably most promo expansions. Currently, MKMTool will not translate those, you will have to do it manually.

If you are interested in adding the support for some other format, leave a suggestion on the MKMTool's issues board.

The last option for export is "Only appraised". When this is not checked, all the articles in the exported list will exactly match the ones in the imported one line by line. That means that even articles that were either not successfully imported, or not successfully appraised will still be there. If you check "Only appraised", only the ones that had at least one price generated for them will be exported.

For the second export mode, Upload to MKM, all you have to do is set which price should be used as the price for which you will be selling the article and then press the button and wait a little while. You can check the "Log all uploaded articles" to see what articles and at what price are being uploaded, otherwise you will see only the ones that either failed to be uploaded or did not have a valid price set to them. Regarding what price is used, you can choose any of the two MKMTool prices, i.e. the cheapest similar item or the full MKMTool price. Alternatively you can choose one of the price guides, using the same logic as described above in the Import section: "Price guide - Low" is LOWFOIL for foils, LOWEX for non-foil in EX+ condition, LOW for worse conditions; "Price guide - Average" is TRENDFOIL for foils and AVG for non-foils; and "Price guide - Trend" is TRENDFOIL for foils and TREND for non-foils. In any case, it is recommended to at least check the prices first by exporting to CSV and looking at them - the price guide prices are often very inaccurate, especially for articles that do not get sold very often, i.e. old expensive cards.

In order to be able to upload a given card to MKM, it has to have a Language - while it is possible to use "All" as the default language and MKMTool will be able to appraise such item, you must specify some language to be able to upload it to MKM. Also keep in mind that any boolean flags set to "Any" will be interpreted as "false" by MKM.

Want List Editor

screenshot

Easy Editor for MKM want list, I written this since the MKM features to build a list were too unhandy for me. This works well with the check for cheap deals feature. However, the functionality is (in the current version) limited: for language, you have to choose either all, or one specific language, not a combination of several languages; you have to choose one precise condition; for boolean flag as foil, signed etc., you can choose only yes or no, not "any"; for expansions, you have to choose a specific one, you can't choose "any"; similarly, if you have chosen "any" expansion in the MKM's want list editor, MKMTool will display it only as "", it won't list all the possible expansions.

View Inventory

Shows you a list of your currently listed item. There is a button to export your inventory to a CSV file using the formatting MKMTool uses for other modules - see CSV Card Lists in MKMTool.

Other Features / Options

Account Info

Does what it says, shows you the info stack of your account in raw data.

Update Local MKM Product List

Updates the local offline database provided from MKM. This CSV is usually maintained by the program, it automatically updates itself if it is older than 100 days or when some module fails to find the data it is asking for (and the database is more than 1 day old). So most of the time, you should not need to click this button, except in cases when for example new expansion just comes out and you want to use the Check for Cheap Deals option, updating the database will make the new expansion appear in the list of expansions.

CSV Card Lists in MKMTool

There are several modules in MKMTool that use import or export from/to Comma Separated Value (CSV) files. Each module has some specific to which card attributes are or are not expected to be in the list, but the general format is the same and described below. To create the file, it is recommended to use your favourite spreadsheet software, all of them should have an option to save as CSV. However, there are several viable formats, so ensure that the one your spreadsheet software is using follows these rules:

The first line of the file must be a header naming all the columns - the attributes of the cards. Below you will find a list of all attribute names that are recognized by MKMTool. However, your file may contain other columns as well, they will simply be ignored. The attribute may also be in any order. If there are multiple attributes with the same names, only the latest will be used. Some attribute names have synonyms - for example, your column can be named "Name" or "enName", it will be understood the same way. If you have two (or more) attributes that are synonyms, both will be kept, but keep in mind that MKMTool internally works only with the "main" name of the attribute, so if you for some reason have different values in the two columns, only the "main" one will count, the other will be kept along, but never used internally.

The following is the list of all recognized attributes. Note that all of the attribute names are case sensitive and many of the values are as well:

As was mentioned several times in the list above, the format is done in such a way to be compatible with card lists you might export from various other tools for collection management. Currently it is compatible with deckbox.org, if you are using other tools and their export format is not directly compatible, leave a message on MKMTool's issue board and if it is simple enough to incorporate the format, someone might do it.

Resource URLS

Here are some URLs I thing you need to know about:

And finally

The development of this tool cost me a lot of time recently and a few bad (luckily bulk card) sales during the adjustment of the algorithm but it was worth it to see it done now.

If you like this tool, you can donate me some bitcoin leftovers to my wallet here:

13Jjvvnmn6t1ytbqWTZaio1zWNVWpbcEpG

Or buy me something of my amazon wishlist here:

https://www.amazon.de/registry/wishlist/PY25W6O71YIV/ref=cm_sw_em_r_mt_ws__ugkRybY0HFNYD

Sorry I don’t have paypal.

If you are producing a commercial product and need some help with the MKM API or you want to integrate some of my code in your application, feel free to contact me.